我在后端执行许多api调用的应用程序遇到麻烦。因此,应用程序收到超时错误。
有人建议我应该使用队列。我已经尝试过这样做。该函数将在工作中使用并使用处理程序,但我希望页面在后台进行API调用时会加载我提供的数据,而不会包含来自api的数据。相反,它就像我不使用队列时一样经历了。我尝试遵循一个教程来执行此操作,但是他们做的并不完全相同,我无法对其进行调整,因此它将对我有用。
有关我在工作中的工作的信息。我从csv中获取注释,并且我使用注释中的数字来调用api,并且我得到了一个8-10个字段的json。我需要调用api约650次,因此将数据保存到数据库时需要花费很长时间。我一次使用一个插入来使用“缓存”,所以我不会两次进行相同的调用。
这是我上班的控制器。
class ImportController extends Controller
{
public function checkErrors(Request $request)
{
$this->checkAgainstDocuments($csv_id);
$supplierErrorIds=$this->checkSupplierErrors($parameters, $company , $csv_id);
$timesheetErrors=TsData::whereIn('id', $supplierErrorIds)->sortable()->paginate(20);
return view('show_errors', compact('timesheetErrors', 'company', 'csv_id'));
}
public function checkAgainstDocuments($csv_id)
{
GetFromDocumentsAPI::dispatch($csv_id)->delay(now()->addMinutes(10));
}
}
这是我使用的工作:
class GetFromDocumentsAPI implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $csv_id;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($csv_id)
{
//
$this->csv_id=$csv_id;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$comments = TsData::select('id', 'comments')->where('csv_id', $this->csv_id)->get()->toArray();
$commentIDs = array();
foreach ($comments as $comment) {
preg_match_all('/(\d{5,})/', $comment['comments'], $out, PREG_PATTERN_ORDER);
foreach ($out as $item) {
$commentIDs[$comment['id']] = $item;
}
}
$commentIDs = array_filter($commentIDs);
$apiKey=config('app.apiKey');
$documentsResponse = array();
Issue::truncate();
$arrayTest=[];
foreach ($commentIDs as $key => $commentID) {
foreach ($commentID as $item) {
$issue = Issue::where('id', $item)->first();
if ($issue === null) {
try {
$url = file_get_contents('https://documents.calibrate.be/issues/' . $item . '.json?key=' . $apiKey);
$json = json_decode($url, true);
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
$issue = Issue::Create(['id'=>$item, 'name'=>$json['issue']['subject'], 'projectId'=>$json['issue']['project']['id'], 'priority'=>$json['issue']['priority']['id']]);
}
}
}
}
config / queue.php
'default' => env('QUEUE_DRIVER', 'redis'),
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
答案 0 :(得分:2)
在.env文件集QUEUE_CONNECTION=redis
答案 1 :(得分:0)
默认情况下,Laravel使用sync
驱动程序来处理队列。
确保将QUEUE_CONNECTION
配置变量设置为database
或redis
或任何其他服务。
可以在.env
文件和config/queue.php
文件中进行相同的设置。
要使用database
,请
php artisan queue:table
和php artisan migrate
。这将创建所有需要运行的表。php artisan queue:work
要使用redis
,请
sudo apt-get install redis-server
并启动Redis服务器$ sudo systemctl enable redis-server.service
。 (对于基于Linux的系统).env
或config/queue.php
中配置和设置Redis特定变量 P.S。进行更改后,运行php artisan config:clear
命令,以使更改反映在缓存中。