Laravel队列-作业之间暂停

时间:2018-12-12 10:31:43

标签: php laravel laravel-5 queue amazon-sqs

我想创建一个仅每X秒运行一次作业的队列(AMAZON SQS)。因此,如果突然提交了50个作业,最终将排在队列中。然后,队列侦听器拉出一个作业,执行某些操作并等待X秒。之后,下一个作业被拉出。再暂停X秒。等等等

对于队列侦听器,sleep选项仅确定在没有新作业可用时工作人员将“睡眠”多长时间。因此,只有在队列中没有任何内容时,它才会进入睡眠状态。

还是我应该在我的PHP代码中添加一个暂停(x)?

[edit]我刚刚用FIFO和标准AWS SQS队列测试了睡眠方法,这使整个队列混乱了。突然(成功)重新提交作业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);


}
}

2 个答案:

答案 0 :(得分:0)

是的,您需要设置您的php代码,没有其他方法。

Php sleep

答案 1 :(得分:0)

我有完全相同的问题要解决。我正在使用Laravel 5.8,但看不到如何使队列工作器在作业之间等待固定的时间。

我现在正在考虑使用计划任务来处理此问题。我可以安排任务每5分钟运行一次,并运行以下artisan命令:

$schedule->command('queue:work --queue=emails --once')->everyFiveMinutes();

这将从队列中取出一项作业并运行它。不幸的是,对于工作的处理频率没有更多的粒度控制。