《PHP編程:Laravel 4.2 中隊(duì)列服務(wù)(queue)使用感受》要點(diǎn):
本文介紹了PHP編程:Laravel 4.2 中隊(duì)列服務(wù)(queue)使用感受,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
這半個(gè)月,我介入重寫(xiě)了一個(gè)微信公眾號(hào)后端系統(tǒng),首次使用了laravel 4.2,以及l(fā)aravel引以為傲的隊(duì)列服務(wù)(queue).PHP學(xué)習(xí)
由于整個(gè)系統(tǒng)涉及到多端交互,又有大量語(yǔ)音傳輸、處理的業(yè)務(wù),我們?cè)谝恍┑胤桨l(fā)現(xiàn)響應(yīng)時(shí)間過(guò)長(zhǎng).之前的系統(tǒng)基于node.js和mongoDB,由于node天生便是異步,有守護(hù)進(jìn)程,所以并沒(méi)有出現(xiàn)過(guò)這個(gè)問(wèn)題,而這次重寫(xiě)必然要引入異步流程了.Queue進(jìn)入了我們的視線.PHP學(xué)習(xí)
根據(jù)這一頁(yè)幾乎還全是英文的”中文文檔“ ,laravel恰好在4.2版本中剛剛引入了redis作為隊(duì)列存儲(chǔ),這是一個(gè)非常好的消息.OK,配景介紹到這里,下面扯扯干貨.PHP學(xué)習(xí)
laravel中的隊(duì)列服務(wù)跟其他隊(duì)列服務(wù)也沒(méi)有什么不同,都是最符合人類思維的最簡(jiǎn)單最普遍的流程:有一個(gè)地方存放隊(duì)列信息,一個(gè)PHP進(jìn)程在運(yùn)行時(shí)將任務(wù)寫(xiě)入,另外一個(gè)PHP守護(hù)進(jìn)程輪詢隊(duì)列信息,將達(dá)到執(zhí)行要求的任務(wù)執(zhí)行并刪除.由于PHP是url驅(qū)動(dòng)的同步語(yǔ)言,自己是阻塞的,所以laravel提供一個(gè)守護(hù)進(jìn)程工具來(lái)查詢并執(zhí)行隊(duì)列信息也就不足為奇了.PHP學(xué)習(xí)
Laravel的queue配置文件是 /app/config/queue.php,在 Default Queue Driver 這一項(xiàng)中,可以選擇"sync", "beanstalkd", "sqs", "iron", "redis" 五種驅(qū)動(dòng)器.PHP學(xué)習(xí)
1. sync是當(dāng)?shù)卣{(diào)試用的同步驅(qū)動(dòng)器PHP學(xué)習(xí)
2. beanstalkd 是一個(gè)專業(yè)隊(duì)列服務(wù)驅(qū)動(dòng)器:http://kr.github.io/beanstalkd/PHP學(xué)習(xí)
3. sqs和iron是國(guó)外第三方隊(duì)列服務(wù)PHP學(xué)習(xí)
4. 最后一項(xiàng)redis給了我們一個(gè)使用redis的理由,這樣我們趁便把緩存服務(wù)和session服務(wù)全部遷移到redis上了.PHP學(xué)習(xí)
0. 順便說(shuō)一句,session驅(qū)動(dòng)器千萬(wàn)別用mysql,處理時(shí)間1S不是夢(mèng),哎,看誰(shuí)呢,說(shuō)的便是你,1S哥!PHP學(xué)習(xí)
隊(duì)列服務(wù)需要專門新建任務(wù)類,作為獨(dú)立類,他們不需要繼承類,因?yàn)殛?duì)列里的任務(wù)在執(zhí)行的時(shí)候,是由PHP守護(hù)進(jìn)程來(lái)獨(dú)立調(diào)用的,當(dāng)然如果你要use一下別的類再調(diào)用,也不會(huì)出錯(cuò).之前我把很多額外服務(wù)獨(dú)立到了一個(gè)單獨(dú)的文件夾 /app/services 里,比如輸入信息驗(yàn)證 validator,特殊平安驗(yàn)證模塊等,這次queue類們就位于其中.PHP學(xué)習(xí)
queue的使用非常簡(jiǎn)單,下面便是一個(gè)簡(jiǎn)單的示例:PHP學(xué)習(xí)
這就是一個(gè)標(biāo)準(zhǔn)的queue壓入流程了.當(dāng)然,在這里我把CurlJsonQueue類放到了services根目錄下,這個(gè)目錄已經(jīng)被我注冊(cè)到composer.json的"autoload"的"classmap"中,是位于頂層命名空間中的,可以直接調(diào)用,如果必要調(diào)用非頂層命名空間,是可以寫(xiě) App\OOXX 的.我們的系統(tǒng)必要大量和微信服務(wù)器交互,所以就獨(dú)立出來(lái)了這個(gè)類.PHP學(xué)習(xí)
class CurlJsonQueue extends BaseController{PHP學(xué)習(xí)
?public function fire($job, $data)
?{
??$url = $data['url'];
??$json = $data['json'];PHP學(xué)習(xí)
??parent::base_post_curl($url, $json);PHP學(xué)習(xí)
??$job->delete();
?}
}
PHP學(xué)習(xí)
這個(gè)類默認(rèn)的辦法是 fire() ,參數(shù)也是固定的兩個(gè) $job 和 $data,由于我在BaseController中封裝了post的curl模塊,所以就調(diào)用了一下.另外這里還有一個(gè)小坑,當(dāng)時(shí)寫(xiě)base_post_curl() 的時(shí)候用的protected,導(dǎo)致use BaseController無(wú)效,必須繼承.PHP學(xué)習(xí)
通過(guò)執(zhí)行上面的代碼,queue中就被放入了一個(gè)新的任務(wù),laravel通過(guò)下面的命令開(kāi)啟守護(hù)進(jìn)程:PHP學(xué)習(xí)
然后守護(hù)進(jìn)程就開(kāi)始處置隊(duì)列了.此代碼中的PHP命令和artisan文件的路徑請(qǐng)自行調(diào)整.PHP學(xué)習(xí)
大家可能注意到了,我們要使用的這個(gè)隊(duì)列系統(tǒng)用到了redis和PHP命令行,如果在測(cè)試環(huán)境,加個(gè)開(kāi)機(jī)啟動(dòng)甚至是手動(dòng)啟動(dòng)都可以,但是在生產(chǎn)環(huán)境就必要更穩(wěn)固的工具來(lái)守護(hù)這兩個(gè)程序,我們用的是supervisor,關(guān)于supervisor的安裝配置大家可以參考這篇文章: http://blog.segmentfault.com/qianfeng/1190000000532561 注意,文章里有小坑請(qǐng)自行去踩...PHP學(xué)習(xí)
OK,全部配置好之后,跑起來(lái)redis和PHP命令行,整個(gè)系統(tǒng)就開(kāi)始愉快地運(yùn)行啦~PHP學(xué)習(xí)
使用感受:PHP學(xué)習(xí)
隊(duì)列服務(wù)超好用,之前一次和app的交互流程必要6-7S,異步以后降低到2S以內(nèi),基本就是傳輸時(shí)間和PHP代碼運(yùn)行時(shí)間了,耗時(shí)的特殊操作已經(jīng)異步了.不過(guò)隊(duì)列服務(wù)默認(rèn)1S開(kāi)一個(gè)進(jìn)程檢查一次redis中有沒(méi)有可以運(yùn)行的服務(wù),在阿里云服務(wù)器上,大約能占到單核的10%,消耗略大,而且隊(duì)列處理時(shí)間相對(duì)較長(zhǎng),因?yàn)闆](méi)有了之前同步時(shí)候的文件加載福利.不過(guò)如果有多個(gè)任務(wù),PHP進(jìn)程是會(huì)連續(xù)執(zhí)行的,不會(huì)1S執(zhí)行一個(gè)的啦.PHP學(xué)習(xí)
下面說(shuō)說(shuō)坑:PHP學(xué)習(xí)
1. 由于queue核心類使用了一個(gè)特殊函數(shù),導(dǎo)致沒(méi)有明確類型的變量會(huì)以單元素?cái)?shù)組的形式存進(jìn)json,再存進(jìn)redis.解決方法就是在每一個(gè)要放進(jìn)去的數(shù)據(jù)前面加上 ''. .上面的$url和$json由于都已經(jīng)在前面用引號(hào)進(jìn)行了類型申明,故沒(méi)做這一步操作.PHP學(xué)習(xí)
2. 如果要傳遞url給隊(duì)列,系統(tǒng)queue類會(huì)在每一個(gè) / 前面加上兩個(gè) \\ .這對(duì)于一些特殊操作可能會(huì)造成致命影響.(開(kāi)打趣,有上面那個(gè)致命么!)PHP學(xué)習(xí)
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP編程:Laravel 4.2 中隊(duì)列服務(wù)(queue)使用感受》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/14383.html