主頁(yè) > 知識(shí)庫(kù) > Laravel框架隊(duì)列原理與用法分析

Laravel框架隊(duì)列原理與用法分析

熱門標(biāo)簽:電信外呼系統(tǒng)多少錢一個(gè)月 宿州正規(guī)外呼系統(tǒng)軟件 桂陽(yáng)公司如何做地圖標(biāo)注 企業(yè)400電話辦理多少費(fèi)用 代理打電話機(jī)器人 合肥企業(yè)外呼系統(tǒng)線路 神龍斗士電話機(jī)器人 萍鄉(xiāng)商鋪地圖標(biāo)注 太原400電話申請(qǐng)流程

本文實(shí)例講述了Laravel框架隊(duì)列原理與用法。分享給大家供大家參考,具體如下:

最近有朋友有朋友問(wèn)laravel隊(duì)列的實(shí)現(xiàn)原理和經(jīng)驗(yàn),剛好用過(guò)所以整理了一下分享給大家。

laravel隊(duì)列配置參見:http://d.laravel-china.org/docs/5.1/queues

原理分析

創(chuàng)建分發(fā)任務(wù)方法

class TestController extends Controller
{
  //其他方法
  //發(fā)送消息
  public function SendMessage(Request $request){
    ...
    $this->dispatch((new SendMessage($sendParams))->onQueue('snail:SendMessage'));
  }
}

內(nèi)部實(shí)現(xiàn):

創(chuàng)建消費(fèi)任務(wù)

命令行運(yùn)行如下命令:

/home/niuyufu/php/bin/php /home/niuyufu/webroot/assistant_api/artisan queue:work --queue=snail:SendMessage --tries=3 --memory=512 --daemon

內(nèi)部實(shí)現(xiàn):

隊(duì)列消息分析:

監(jiān)控redis對(duì)應(yīng)隊(duì)列消息,具體產(chǎn)生的消息操作,如下:

tail -f | redis-cli -h 10.94.120.13 -p 6380 monitor | grep "queues:snail"
1492446053.406282 [0 10.95.117.155:57132] "WATCH" "queues:snail:SendMessage:delayed"
1492446053.406452 [0 10.95.117.155:57132] "ZRANGEBYSCORE" "queues:snail:SendMessage:delayed" "-inf" "1492446053"
1492446053.406754 [0 10.95.117.155:57132] "WATCH" "queues:snail:SendMessage:reserved"
1492446053.406842 [0 10.95.117.155:57132] "ZRANGEBYSCORE" "queues:snail:SendMessage:reserved" "-inf" "1492446053"
1492446053.407029 [0 10.95.117.155:57132] "LPOP" "queues:snail:SendMessage"
1492446053.407700 [0 10.95.117.155:57132] "ZADD" "queues:snail:SendMessage:reserved" "1492446113" "{job}"
1492446053.463953 [0 10.95.117.155:57132] "ZREM" "queues:snail:SendMessage:reserved" "{job}"

PS:如果你的redis是codis的話,注意了,因?yàn)閏odis禁用方法列表

KEYS, MOVE, OBJECT, RENAME, RENAMENX, SORT, SCAN, BITOP,MSETNX, BLPOP, BRPOP, BRPOPLPUSH, PSUBSCRIBE,PUBLISH, PUNSUBSCRIBE, SUBSCRIBE, UNSUBSCRIBE, 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, FLUSHDB, INFO, LASTSAVE, MONITOR, SAVE, SHUTDOWN, SLAVEOF, SLOWLOG, SYNC, TIME

所以執(zhí)行消費(fèi)任務(wù)會(huì)有以下錯(cuò)誤:

[Predis\Connection\ConnectionException]
Error while reading line from the server. [tcp://100.90.154.39:3000]

解決方法為修改config/queue.php

'redis' => [
  'driver' => 'redis',
  'connection' => 'default',
  'queue' => 'default',
  'expire' => null,  //禁用即可
],

優(yōu)化日志處理:

如果你的系統(tǒng)有切割文件日志操作。會(huì)發(fā)現(xiàn)雖然日志被切分了,但程序卻沒有往新文件里寫入。如,2017-04-18 13:50啟動(dòng)的項(xiàng)目,日志會(huì)一直打到 snail.log.2017041813上。

改進(jìn)方案:

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

public function releaseLoggerFile(){
  $handles=\Log::getMonolog()->getHandlers();
  if(!is_array($handles) || empty($handles)){
    return;
  }
  foreach($handles as $handle){
    if(method_exists($handle, "close")){
      $handle->close();
    }
  }
  return;
}

在具體job實(shí)現(xiàn)類中的handle方法結(jié)尾添加:

public function handle()
{
  ...
  $this->releaseLoggerFile(); //釋放log文件
}

線上部署

創(chuàng)建任務(wù)shell

#!/bin/sh
day=$(date +'%y%m%d')
now=$(date +"%F %T")
php_command="/home/niuyufu/php/bin/php"
command="/home/niuyufu/webroot/snail_api/artisan"
log="/home/niuyufu/webroot/log/wave"
queue_name_arr=("snail:SendMessage" "snail:SendMessageToApp")
case $1 in
"run")
  for queue_name in ${queue_name_arr[*]}
  do
    count=$(ps aux | grep artisan |grep queue=${queue_name} | grep -v grep | wc -l)
    if [ ${count} -lt 1 ];then
      echo "${now}:${queue_name} process has exit ${count}\n";
      nohup $php_command $command queue:work --queue=${queue_name} --tries=3 --memory=512 --daemon >> $log/queueMonitor.log 2>1 
    else
      echo "${now}:${queue_name} process is runing";
    fi
  done
  ;;
"stop")
  kill -9 $(ps -ef | grep "queue:work" | grep -v grep | awk '{print $2}' | tr -s '\n' ' ')
  echo ${now}."Queue process all stop";
  ;;
"list")
  ps -ef | grep "queue:work" | grep -v grep
  ;;
*)
  echo "
Usage: QueueMonitorCommandShell.sh [run|stop|list]
  "
  ;;
esac

總結(jié):

laravel這邊的延遲隊(duì)列使用了三個(gè)隊(duì)列。

queue:default:delayed // 存儲(chǔ)延遲任務(wù)
queue:default // 存儲(chǔ)"生"任務(wù),就是未處理任務(wù)
queue:default:reserved // 存儲(chǔ)待處理任務(wù)
任務(wù)在三個(gè)隊(duì)列中進(jìn)行輪轉(zhuǎn),最后一定進(jìn)入到queue:default:reserved,并且成功后把任務(wù)從這個(gè)隊(duì)列中刪除。

laravel5.1 使用了watch來(lái)控制隊(duì)列的原子操作,但由于codis本身不支持 watch 方法。所以使用codis不能完全體驗(yàn)隊(duì)列功能:延遲隊(duì)列不支持、不支持?jǐn)?shù)據(jù)重跑,對(duì)線上數(shù)據(jù)比較嚴(yán)格操作謹(jǐn)慎使用。

laravel5.3 之后redis隊(duì)列 開始使用lua腳本支持的隊(duì)列原子操作,它沒有使用 watch multi等操作,所以如果線上codis 支持lua的話,可以完整體驗(yàn)到隊(duì)列功能。

參考文檔:

https://laravel-china.org/articles/4169/analysis-of-laravel-message-queue
http://laravelacademy.org/post/2012.html

更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進(jìn)階教程》、《php優(yōu)秀開發(fā)框架總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家基于Laravel框架的PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • laravel5.6 框架郵件隊(duì)列database驅(qū)動(dòng)簡(jiǎn)單demo示例
  • Laravel使用Queue隊(duì)列的技巧匯總
  • Docker部署Laravel應(yīng)用實(shí)現(xiàn)隊(duì)列&任務(wù)調(diào)度
  • Laravel 6 將新增為指定隊(duì)列任務(wù)設(shè)置中間件的功能
  • Laravel 隊(duì)列使用的實(shí)現(xiàn)
  • Laravel中為什么不使用blpop取隊(duì)列詳析
  • 關(guān)于 Laravel Redis 多個(gè)進(jìn)程同時(shí)取隊(duì)列問(wèn)題詳解
  • 源碼分析 Laravel 重復(fù)執(zhí)行同一個(gè)隊(duì)列任務(wù)的原因
  • Laravel使用消息隊(duì)列需要注意的一些問(wèn)題
  • Laravel中利用隊(duì)列發(fā)送郵件的方法示例
  • 淺談Laravel隊(duì)列實(shí)現(xiàn)原理解決問(wèn)題記錄
  • 淺析Laravel5中隊(duì)列的配置及使用
  • PHP的Laravel框架中使用消息隊(duì)列queue及異步隊(duì)列的方法
  • Laravel 4.2 中隊(duì)列服務(wù)(queue)使用感受
  • Laravel框架中隊(duì)列和工作(Queues、Jobs)操作實(shí)例詳解

標(biāo)簽:白銀 廊坊 太原 辛集 綏化 鄂州 衡陽(yáng) 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Laravel框架隊(duì)列原理與用法分析》,本文關(guān)鍵詞  Laravel,框架,隊(duì)列,原理,與,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Laravel框架隊(duì)列原理與用法分析》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Laravel框架隊(duì)列原理與用法分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章