gpt4 book ai didi

php - 使用redis在laravel中排队

转载 作者:IT王子 更新时间:2023-10-29 06:16:27 25 4
gpt4 key购买 nike

我在处理一个应用程序时遇到了问题,因为我在后端进行了很多 api 调用。因此,应用程序会收到超时错误。

有人建议我应该使用队列。我试过用redis这样做。该函数进入工作并使用处理程序,但我希望页面加载我提供的数据,而没有来自 api 的数据,而 api 调用在后台进行。相反,它就像我没有使用队列时一样经历。我试着按照教程来做这件事,但他们做的并不完全一样,我无法调整它,所以它对我有用。

有关我在工作中所做的信息。我从一个 csv 中得到注释,然后我使用注释中的数字调用 api,然后我得到一个包含 8-10 个字段的 json。我需要调用 api 大约 650 次,所以当我想将数据保存到数据库时需要很长时间。我一次使用一个插入来使用“缓存”,所以我不会两次执行相同的调用。

这是我调用作业的 Controller 。

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']]);

}
}
}

配置/queue.php

'default' => env('QUEUE_DRIVER', 'redis'),

'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],

最佳答案

默认情况下,Laravel 使用 sync 驱动来处理队列。

确保 QUEUE_CONNECTION 配置变量设置为 databaseredis 或任何其他服务。同样可以在 .env 文件和 config/queue.php 文件中设置。

要使用数据库,做

  1. 运行 php artisan queue:tablephp artisan migrate。这将创建运行所需的所有表。
  2. 确保队列工作程序在后台运行。您可以通过运行 php artisan queue:work
  3. 在控制台中执行此操作

要使用 redis ,请执行

  1. 安装 sudo apt-get install redis-server 并启动 redis 服务器 $ sudo systemctl enable redis-server.service。 (对于基于 Linux 的系统)
  2. .envconfig/queue.php 中配置和设置 redis 特定变量

附言进行更改后运行 php artisan config:clear 命令,以便更改反射(reflect)在缓存中。

关于php - 使用redis在laravel中排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55002654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com