laravel队列使用注意问题

你看了一千个正确答案,还是要一秒一秒的等时间

任务超时

任务可以运行的最大秒数可以使用 Artisan 命令行上的 --timeout 开关指定:

1
php artisan queue:work --timeout=30

这个选项指定了 Laravel 队列处理器最多执行多长时间后就应该被关闭掉。有时候一个队列的子进程会因为很多原因僵死,比如一个外部的 HTTP 请求没有响应。这个 –timeout 选项会移除超出指定事件限制的僵死进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

namespace App\Jobs;

class ProcessPodcast implements ShouldQueue
{
/**
* 任务运行的超时时间。
*
* @var int
*/
public $timeout = 120;
}

任务过期

config/queue.php 配置文件里,每一个队列连接都定义了一个 retry_after 选项。这个选项指定了任务最多处理多少秒后就被当做失败重试了。比如说,如果这个选项设置为 90,那么当这个任务持续执行了 90 秒而没有被删除,那么它将被释放回队列。通常情况下,你应该把 retry_after 设置为最长耗时的任务所对应的时间。

二者区别

retry_after 配置选项和 --timeout 命令行选项是不一样的,但是可以同时工作来保证任务不会丢失并且不会重复执行。
--timeout应该永远都要比retry_after短至少几秒钟的时间。这样就能保证任务进程总能在失败重试前就被杀死了。如果你的--timeout选项大于retry_after 配置选项,你的任务可能被执行两次。

queue:listen 和 queue:work

queue:work在启动后,代码修改,queue:work不会再 Load 上下文,但是 queue:listen仍然会重新 Load 新代码。

队列监听

1
php artisan queue:work --daemon --quiet --queue=default --delay=3 --sleep=3 --tries=3
  • –quiet

不输出任何内容

  • –delay=3

一个任务失败后,延迟多长时间后再重试,单位是秒。这个值的设定我个人建议不要太短,因为一个任务失败(比如网络原因),重试时间太短可能会出现连续失败的情况。

  • –sleep=3

去 Redis 中拿任务的时候,发现没有任务,休息多长时间,单位是秒。这个值的设定要看你的任务是否紧急,如果是那种非常紧急的任务,不能等待太长时间。

  • –tries=3

定义失败任务最多重试次数。这个值的设定根据任务的重要程度来确定,一般 3 次比较适合。

  • –daemon

以守护进程的方式运行,在 supervisor 中一般要加这个 option,可以节省 CPU 使用。

Supervisor

使用 Supervisor 监听 Laravel 队列任务,其中 Supervisor 的配置如下

1
2
3
4
5
6
7
8
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemon
autostart=true
autorestart=true
numprocs=8
redirect_stderr=true
stdout_logfile=/var/www/xxx.cn/worker.log

注意 numprocs = 8,代表开启 8 个进程来执行 command 中的命令, 这样就可以大大加快队列的执行速度,如果仅仅是一个进程, 队列就相当于顺序执行。

https://laravel-china.org/docs/laravel/5.5/queues#744c5b