任务超时
任务可以运行的最大秒数可以使用 Artisan
命令行上的 --timeout
开关指定:
php artisan queue:work --timeout=30
这个选项指定了 Laravel 队列处理器最多执行多长时间后就应该被关闭掉。有时候一个队列的子进程会因为很多原因僵死,比如一个外部的 HTTP 请求没有响应。这个 –timeout 选项会移除超出指定事件限制的僵死进程。
<?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 新代码。
队列监听
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 队列任务,详情见这里。
numprocs=8
代表开启8个进程来执行队列,这样就可以大大加快队列的执行速度,如果仅仅是一个进程,队列就相当于顺序执行。