Laravel 队列 - 作业之间暂停

问题描述 投票:0回答:3

我想创建一个队列(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);


}
}
php laravel laravel-5 queue amazon-sqs
3个回答
1
投票

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

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

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

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


0
投票

确实,你需要让你的php代码休眠,没有其他办法。

Php 睡眠


0
投票

您可以将 --rest 添加到您的队列:工作命令中。这将在每个作业之间暂停 10 秒: php artisan queue:work --rest=10

https://github.com/laravel/framework/blob/100ed71fe11a25908539c57368a048ec80c6123d/src/Illuminate/Queue/WorkerOptions.php#L47

© www.soinside.com 2019 - 2024. All rights reserved.