我想创建一个队列(AMAZON SQS),每 X 秒只运行一次作业。因此,如果突然提交 50 个作业,最终会进入队列。然后队列侦听器拉取作业,执行某些操作并等待 X 秒。之后,下一个工作就会被拉动。又停顿了 X 秒。等等等等
对于队列侦听器,睡眠选项选项仅决定在没有新作业可用的情况下工作线程将“睡眠”多长时间。所以只有当队列中没有任何内容时它才会休眠。
或者我应该在 PHP 代码中加入暂停(x)?
[编辑]我刚刚使用 FIFO 和标准 AWS SQS 队列测试了 sleep 方法,这弄乱了整个队列。突然,作业(成功)重新提交了 3 次,然后进入失败状态。此外,我的代码中给出的延迟(3-4 分钟)被忽略,而是花了一分钟
<?php
namespace App\Jobs;
use App\City;
class RetrieveStations extends Job
{
protected $cities;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct ($cities)
{
$this->cities = $cities;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// code here
doSomething()
sleep(X);
}
}
我有完全相同的问题需要解决。我正在使用 Laravel 5.8,但我不知道如何让队列工作人员在作业之间等待固定的时间。
我现在正在考虑使用计划任务来处理这个问题。我可以安排一个任务运行一次,例如每 5 分钟运行一次,并运行以下 artisan 命令:
$schedule->command('queue:work --queue=emails --once')->everyFiveMinutes();
这将从队列中取出一项作业并运行它。不幸的是,对于处理作业的频率没有更精细的控制。
确实,你需要让你的php代码休眠,没有其他办法。
您可以将 --rest 添加到您的队列:工作命令中。这将在每个作业之间暂停 10 秒: php artisan queue:work --rest=10