1. 在修改 queue 相关代码后,必需要使用 php artisan queue:restart 来重启队列服务,不然所作的修改可能不会生效(无法重现了,按理说应该和使用 queue:listen 或 queue:work 有关,不过最好仍是重启;可能和 supervisor 开启多个 queue:work 进程也有关系,本地测试的时候只有一个进程)。php
文档:前端
二、开发环境下以同步的方式执行队列,将 queue driver 的值改成 sync,注意,若是 queue 有输出的话,可能会致使一些问题,如:原本应该只返回 json 串的,而后 queue 里面有输出,致使前端 json 解析失败。laravel
三、何时使用 queue:listen?何时使用 queue:work?redis
官网文档有一段描述是:json
在 queue:work
Artisan 命令里包含了 --daemon
选项,强制队列服务器持续处理任务,而不须要从新启动整个框架。比起 queue:listen
命令,这将明显的减小 CPU 的用量。缓存
使用 queue:work 的时候不须要重现启动整个框架,这多是 1 中可能修改 Job 后不生效的问题。服务器
四、多个项目同时部署时候的冲突框架
laravel 中队列任务使用 redis 驱动状况下保存的时候的缓存 key 是不带前缀的,好比 A 项目 dispatch 了一个 a job,保存在了 queues:default,而后咱们去 B 项目 dispatch 另外一个 job,咱们发现它们保存在了相同的 redis key 中测试
这样会致使的问题是:在一个项目中跑 php artisan queue:work 会拿到另一个项目的 job,这样就会致使一些没必要要的异常,由于在反序列化的过程当中会找不到对应的类。 spa
缘由:config/queue.php 中配置的默认 queue 都是 default:
解决办法:
a、本身用的是 5.1 版本,网上有说能够修改 cache prefix 解决,可是 laravel 5.1 行不通,可能新版本能够
b、为 job 指定不一样的 queue,如 dispatch job 的时候能够 dispatch((new xxJob())->onQueue('xxQueue')),这样一来,job 就保存在了 queues:xxQueue 中,可是仍是得注意,若是还有其余项目,不要取相同名字。同时,这样一来,咱们的 queue:work 或者 queu:listen 命令也要加上 --queue 参数了,如 php artisan queue:work --queue=testQueue,不然仍是会去 queues:default 里面找。以下:
c、直接修改 config/queue.php,修改 redis.queue 为一个惟一的名字。如:
这样一来,咱们的 job 就不会和其余项目的混在一块儿了。
我的见解:最好的实践应该仍是,不一样的队列使用不一样的名字(即便是同一个项目),这样会更便于管理。
5. 给队列的 Job 对象设置模型对象属性的时候,最后处理队列的时候会从新查询这个模型的数据。
详细见:\Illuminate\Queue\SerializesModels
也就是说,咱们若是想在新建 Job 实例的时候,经过 setAttribute 设置了一个模型实例的属性,想在 handle 里面获取这个属性的话,是获取不到的。由于序列化队列任务的时候只会保存模型实例的几个关键属性,详细见:\Illuminate\Contracts\Database\ModelIdentifier
扩展:
一、监控 redis:redis-cli > monitor
二、关于 laravel 队列基本工做方式:dispatch 一个 job 的时候,laravel 把 job 序列化保存到相应的 driver 中(redis、database、file...),而后 queue:listen 或 queue:work 的时候会从对应的 driver 里面取出这个 job,对 payload 反序列化,而后调用 job 里面的 handle 方法进行 job 的处理。