Laravel Queue

使用队列原因

  • 异步
  • 重试

使用队列场景

  • 耗时比较久的,比如上传一个文件后进行一些格式的转化等。
  • 需要保证送达率的,比如发送短信,因为要调用别人的 api,总会有几率失败,那么为了保证送达,重试就必不可少了。

tips

  1. 在开发环境我们想测试的时候,可以把 Queue driver 设置成为 sync ,这样队列就变成了同步执行,方便调试队列里面的任务。
  2. Job 里面的 handle 方法是可以注入别的 class 的,就像在 Controller action 里面也可以注入一样。
  3. 什么时候使用 queue:listen 什么时候使用 queue:work
    答:Laravel 5.3 的文档已经不写 queue:listen 这个指令怎么用了,所以你可以看出来可能官方已经不怎么建议使用 queue:listen 了,但是在本地调试的时候要使用 queue:listen ,因为 queue:work 在启动后,代码修改, queue:work 不会再 Load 上下文,但是 queue:listen 仍然会重新 Load 新代码。
    其余情况全部使用 queue:work 吧,因为效率更高。

命令讲解

命令:

1
php artisan queue:work --daemon --quiet --queue=default --delay=3 --sleep=3 --tries=3
  • –daemon
    总体来说,在 supervisor 中一般要加这个 option,可以节省 CPU 使用。

  • –quiet
    不输出任何内容

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

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

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

注意

Redis 里面一个任务默认最多执行60秒,如果一个任务60秒没有执行完毕,会继续放回到队列中,循环执行,那酸爽…