Laravel 的 queue 分析

2019-07-22 15:56:02 阅读:19 编辑
最佳命令
PHP artisan queue:work --queue=high,default,low --delay=3 --sleep=3 --tries=1 --quiet
PHP artisan job 123456
执行后结果:

Redis-db0 出现 form_database_queues 合集。 form_database_queues:default ( 一条记录)

{
    "displayName":"App\Jobs\TestJob",
    "job":"Illuminate\Queue\CallQueuedHandler@call",
    "maxTries":null,
    "delay":null,
    "timeout":null,
    "timeoutAt":null,
    "data":{
        "commandName":"App\Jobs\TestJob",
        "command":"O:16:"App\Jobs\TestJob":8:{s:2:"id";s:6:"123456";s:6:"*job";N;s:10:"connection";N;s:5:"queue";N;s:15:"chainConnection";N;s:10:"chainQueue";N;s:5:"delay";N;s:7:"chained";a:0:{}}"
    },
    "id":"Apto66 iWBNzHsw6 JNHlXAuZChDxfMP1 g",
    "attempts":0
}
# 只执行一条记录后退出
PHP artisan queue:work --once
//delay 表示延时处理,整数表示秒数,也可以是固定时间
$dis = dispatch (new \App\Jobs\TestJob ($id));
    if ($delay>0){$dis->delay ($delay);
    }

失败 job

1. 失败次数 --tries=0

当 tries=0 (默认值),当 job 处理失败(抛出异常时),会一直死循环执行。所以 tries=1 ( 最小也要为 1)。 当达到 tries 数次后,该 job 会被加入到 failed_jobs 表中

2.--delay [=DELAY](失败的 job 延时多少秒后再处理)

默认为 0

清除所有的失败的 job
PHP artisan queue:flush

重启队列

PHP artisan queue:restart

工作原理:队列启动后,记录 illuminate:queue:restart 的 cache 值 在执行一个新的任务前,判断 illuminate:queue:restart 的 cache 值是否已变化,若变化,则结束队列进程。所以需结合 super 守进程使用。

--sleep [=SLEEP](默认为 3)

当队列没有 job 时,休眠多少秒,这个主要是看你任务的及时性

优先级

多数应用并不需要将任务分配成多到队列,单个队列已经非常适用。但是,应用的任务有优先级差异或者类别差异的时候,多队列将是更好地选择,尤其 Laravel 的队列进程已经支持的情况下。举个例子,你可以将高优先级的任务委派到 “high”(高优先级)队列,从而让它优先执行。

PHP artisan queue:work --queue=high,default

内存 --memory [=MEMORY](默认 128 M)

当一个任务执行的内存超过指定的内存。会被 killed ( 队列进程会中断)

timeout- 超时功能(默认为 60 秒)

当一个任务执行时间超过 timeout 指定的秒数。会被 killed ( 队列进程会中断)。 仅适用于 PHP7.1 或更高版本(需 pcntl 扩展),它也不适用于 Windows

注意事项
  1. 加入到队列时,会将 Job 中的数据加入到数据库,如果延时处理的话,要注意数据是否要变化处理。
  2. 需创建队列失败的表
    PHP artisan queue:failed-table
  3. 当队列有多个任务时,会顺序不间隔处理。sleep 与 delay 参数均无关。 4.windows 用 nssm.exe 也可以使用 PHP artisan queue:restart 来重启队列