1. 在修改 queue 相关代码后,必须要使用 php artisan queue:restart 来重启队列服务,否则所做的修改可能不会生效(没法重现了,按理说应该和使用 queue:listen 或 queue:work 有关,不过最好还是重启;可能和 supervisor 开启多个 queue:work 进程也有关系,本地测试的时候只有一个进程)。

文档:

2、开发环境下以同步的方式执行队列,将 queue driver 的值改为 sync,注意,如果 queue 有输出的话,可能会导致一些问题,如:本来应该只返回 json 串的,然后 queue 里面有输出,导致前端 json 解析失败。

3、什么时候使用 queue:listen?什么时候使用 queue:work?

官网文档有一段描述是:

在 queue:work Artisan 命令里包含了 --daemon 选项,强制队列服务器持续处理任务,而不需要重新启动整个框架。比起 queue:listen 命令,这将明显的减少 CPU 的用量。

使用 queue:work 的时候不需要重现启动整个框架,这可能是 1 中可能修改 Job 后不生效的问题。

4、多个项目同时部署时候的冲突

laravel 中队列任务使用 redis 驱动情况下保存的时候的缓存 key 是不带前缀的,比如 A 项目 dispatch 了一个 a job,保存在了 queues:default,然后我们去 B 项目 dispatch 另一个 job,我们发现它们保存在了相同的 redis key 中

这样会导致的问题是:在一个项目中跑 php artisan queue:work 会拿到另外一个项目的 job,这样就会导致一些不必要的异常,因为在反序列化的过程中会找不到对应的类。

原因: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

扩展:

1、监控 redis:redis-cli > monitor

2、关于 laravel 队列基本工作方式:dispatch 一个 job 的时候,laravel 把 job 序列化保存到相应的 driver 中(redis、database、file...),然后 queue:listen 或 queue:work 的时候会从对应的 driver 里面取出这个 job,对 payload 反序列化,然后调用 job 里面的 handle 方法进行 job 的处理。

使用 laravel 的 queue 必须知道的一些事的更多相关文章

  1. laravel queue队列使用

    一篇文章: laravel中的队列服务跟其他队列服务也没有什么不同,都是最符合人类思维的最简单最普遍的流程:有一个地方存放队列信息,一个PHP进程在运行时将任务写入,另外一个PHP守护进程轮询队列信息 ...

  2. laravel的延迟消息队列

    laravel的延迟消息队列 这篇来自于看到朋友转的58沈剑的一篇文章:1分钟实现"延迟消息"功能(http://mp.weixin.qq.com/s?__biz=MjM5ODYx ...

  3. laravel的消息队列剖析

    laravel的消息队列剖析 这篇来自于看到朋友转的58沈剑的一篇文章:1分钟实现"延迟消息"功能 在实际工作中也不止遇见过一次这个问题,我在想着以前是怎么处理的呢?我记得当初在上 ...

  4. Production-Ready Beanstalkd with Laravel 4 Queues

    原文地址:http://fideloper.com/ubuntu-beanstalkd-and-laravel4 Note: TL;DR version at the bottom! Queues a ...

  5. Laravel异步队列全攻略

    最近项目需求,研究了laravel的异步队列.官方文档虽然很是详细,但也有些晦涩难懂,在此记录下步骤,供大家参考. 1.修改/config/queue.php文件 <?php return [ ...

  6. 队列中使用Database Driver

    队列允许你将一个耗时的任务进行延迟处理. 首先要在.evn文件中配置 QUEUE_DRIVER=database 要使用 database 这个队列驱动的话,则需要创建一个数据表来记住任务,使用命令: ...

  7. python3.x Day6 多进程

    多进程:1.每个子进程申请到的资源都是独立的,不与其他进程共享.2.语法上和线程基本上差不多,使用multiprocessing.Process(target=xxxx,args=(xxx,xxx,x ...

  8. H-Updating a Dictionary (模拟)

    In this problem, a dictionary is collection of key-value pairs, where keys are lower-case letters, a ...

  9. Laravel Scout 开启队列, 自定义queue name和queue connection

    scout.php的默认配置: 'queue' => env('SCOUT_QUEUE', false), 修改为: 'queue' => [ 'queue' => env('SCO ...

随机推荐

  1. 【探路者】Postmortem会议(“事后诸葛亮”会议)

    [探路者]Postmortem会议(“事后诸葛亮”会议) 整理:米赫 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的贪吃蛇游戏主要将完成一个 ...

  2. 11.16 Daily Scrum

    由于今天是工作小周期的最后一天,今天的主要任务是解决了一周留下的技术方面的难题.一些类似于悬浮窗和进度条的bug修复全部在今天得到了解决,修复了数据库的内存泄露bug,软件的搜索功能的完善也接近尾声. ...

  3. java程序设计第二次实验报告

    北京电子科技学院(BESTI) 实验报告 课程:数据结构    班级:1352    姓名:何伟钦     学号:20135223 成绩:            指导教师:娄嘉鹏      实验日期: ...

  4. DPDK实例程序:testpmd

    用户手册:https://doc.dpdk.org/guides/testpmd_app_ug/index.html 还不错的入门:http://syswift.com/188.html 我的运行情况 ...

  5. ubuntu安装php-curl拓展

    首先输入apt-cache search curl | grep php查询curl的php支持名字可能会返回如下内容:php5-curl - CURL module for php5安装:sudo ...

  6. 团队作业之四则运算GUI展示

    一.项目Coding.net原码仓库地址:https://git.coding.net/caoying/Teamwork.git 队员: 卢琪:2016011986 曹滢:2016012102 二.P ...

  7. SQL SERVER安装(2008)

    首先需要下载SQL SERVER2008安装程序:为省的麻烦给出网盘地址自行下载,百度网盘:密码:hslb 1.下载到你所选定文件夹中,我下载在E:\SQL SERVER中 2.选择第一个.exe文件 ...

  8. IE盒模型与W3C盒模型区别

    前两天被人问到,叫我解释一下标准盒模型与IE盒模型,额,当时只能说,知道一点,但是没有深入的去探讨过,所以下来之后就自己写了例子,亲自去验证并且查看了网上的一些资料,现将其整理如下: 一.css盒模型 ...

  9. Ubuntu 14.04(64bit)使用indicator-sysmonitor显示系统运行状态

    原帖位置:http://tieba.baidu.com/p/3005287033 在使用ubutu时,如果可以查看当前系统使用情况,如CPU,内存,网速等是非常爽的,今天就讲一下一个系统运行状态显示软 ...

  10. [C/C++] C++ Primer学习笔记

    记录下自己掌握不清楚的概念和用法... Day 1 endl:具有输出换行的效果,并刷新与设备相关联的缓冲区. 注:在调试程序过程中插入的输出语句都应刷新输出流,否则可能会造成程序崩溃,将会导致程序出 ...