手机版

Laravel框架队列原理与用法分析

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

本文实例讲述了Laravel框架队列原理与用法。分享给大家供大家参考,具体如下:

最近有朋友有朋友问laravel队列的实现原理和经验,刚好用过所以整理了一下分享给大家。

laravel队列配置参见:http://d.laravel-china.org/docs/5.1/queues

原理分析

创建分发任务方法

类测试控制器扩展了控制器{ //其他方法//发送消息公共函数发送消息(请求$ Request){ 0.$ this-dispatch((新发送消息($ send params))-onQueue(' snail : send message ');}}内部实现:

创建消费任务

命令行运行如下命令:

/home/Niu/PHP/bin/PHP/home/Niu/webroot/assistant _ API/artisan queue :工作队列=snail :结束消息-tries=3-内存=512-守护进程

内部实现:

队列消息分析:

监控存储对应队列消息,具体产生的消息操作,如下:

tail-f | redis-CLI-h 10。94 .120 .13-p 6380监视器| grep ' queues 3360 snail ' 1492446053。406282[0 10 .95 .117]36057132“WATCH”队列3360蜗牛3360 sendmail 3360延迟' 149244444452[0 10。999999999999

PS:如果你的存储是联合索引系统的话,注意了,因为联合索引系统禁用方法列表

KEYS,MOVE,OBJECT,RENAME,RENAMENX,SORT,SCAN,BITOP,MSETNX,BLPOP,BRPOP,BRPOPLPUSH,PUNSUBSCRIBE,PUBLISH,PUNSUBSCRIBE,SUBSCRIBE,DISCARD,EXEC,MULTI,UNWATCH,WATCH,SCRIPT EXISTS,SCRIPT FLUSH,SCRIPT KILL,SCRIPT LOAD,AUTH,ECHO,SELECT,BGREWRITEAOF,BGSAVE,CLIENT KILL,CLIENT LIST,CONFIG GET,CONFIG SET,CONFIG RESETSTAT,DBSIZE,DEBUG OBJECT,DEBUG SEGFAULT,FLUSHALL,FLUSH

所以执行消费任务会有以下错误:

[预测\连接\连接异常]从服务器读取行时出错TCP ://100 .90 .154]39:3000

解决方法为修改config/queue.php

redis'=[ 'driver'='redis ',' connection'='default ',' queue'='default ',' expire'=null,//禁用即可],优化日志处理:

如果你的系统有切割文件日志操作。会发现虽然日志被切分了,但程序却没有往新文件里写入。如,2017-04-18 13:50启动的项目,日志会一直打到蜗牛日志。18860 .888888888686上。

改进方案:

app/Jobs/Job.php文件中添加如下方法:

public function release logger file(){ $ handles=\ log :3360 getmonolog()-getHandlers();if(!is_array($handles) ||空($ handles)){ return;} foreach($ handles as $ handle){ if(method _ exists($ handle,' close '){ $ handle-close();} }返回;}在具体工作实现类中的处理方法结尾添加:

公共函数句柄(){ 0.$ this-releaseLoggerfile();//释放原木文件}线上部署

创建任务壳

#!/bin/shday=$(日期% y % m % d’)现在=$(日期% F % T ')PHP _ command='/home/Niu/PHP/bin/PHP ' command='/home/Niu/web root/snail _ API/artisan ' log='/home/Niu/web root/log/wave ' queue _ name _ arr=(' snail : send messagetoapp ')case $ 1 in ' run ')for queue _ name in $ { queue则echo '${now}:${queue_name}进程已退出$ { count } \ n ';nohup $ PHP _ command $ command queue :工作队列=$ { queue _ name }-trys=3-内存=512-守护进程$ log/queuemonitor。日志21 else echo ' $ { now } : $ { queue _ name }进程正在运行;船方不负担装货费用完成;stop)kill-9 $(PS-ef | grep ' queue : work ' | grep-v grep | awk ' { print $ 2 } ' | tr-s ' \ n ' ')echo $ { now } .队列进程全部停止";list)PS-ef | grep ' queue : work“| grep-v grep;*)回显"用法: queueMonitorCommandShell。sh[运行|停止|列表]";环境系统应用中心环境系统应用程序中心总结:

laravel这边的延迟队列使用了三个队列。

队列:默认:延迟//存储延迟任务queue:default //存储'生'任务,就是未处理任务队列:默认:保留/存储待处理任务任务在三个队列中进行轮转,最后一定进入到队列:默认:保留,并且成功后把任务从这个队列中删除。

laravel5.1使用了看来控制队列的原子操作,但由于联合索引系统本身不支持看方法。所以使用联合索引系统不能完全体验队列功能:延迟队列不支持、不支持数据重跑,对线上数据比较严格操作谨慎使用。

laravel5.3之后存储队列开始使用左上臂脚本支持的队列原子操作,它没有使用手表多等操作,所以如果线上联合索引系统支持左上臂的话,可以完整体验到队列功能。

参考文档:

https://laravel-中国。org/articles/4169/analysis-of-laravel-message-queue http://laravelacademy。org/post/2012。超文本标记语言

更多关于Laravel相关内容感兴趣的读者可查看本站专题: 《Laravel框架入门与进阶教程》 、 《php优秀开发框架总结》 、 《php面向对象程序设计入门教程》 、 《php+mysql数据库操作入门教程》 及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Laravel框架的服务器端编程语言(专业超文本预处理器的缩写)程序设计有所帮助。

版权声明:Laravel框架队列原理与用法分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。