最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Laravel 4.2 中隊(duì)列服務(wù)(queue)使用感受

 更新時(shí)間:2014年10月30日 11:52:40   投稿:hebedich  
Laravel的隊(duì)列組件為許多隊(duì)列服務(wù)提供了統(tǒng)一的API接口。隊(duì)列服務(wù)讓你可以異步處理一個(gè)耗時(shí)任務(wù),比如延遲發(fā)送一封郵件,從而大大加快了應(yīng)用的Web請求處理速度。

這半個(gè)月,我參與重寫了一個(gè)微信公眾號后端系統(tǒng),首次使用了laravel 4.2,以及l(fā)aravel引以為傲的隊(duì)列服務(wù)(queue)。

由于整個(gè)系統(tǒng)涉及到多端交互,又有大量語音傳輸、處理的業(yè)務(wù),我們在一些地方發(fā)現(xiàn)響應(yīng)時(shí)間過長。之前的系統(tǒng)基于node.js和mongoDB,由于node天生就是異步,有守護(hù)進(jìn)程,所以并沒有出現(xiàn)過這個(gè)問題,而這次重寫必然要引入異步流程了。Queue進(jìn)入了我們的視線。

根據(jù)這一頁幾乎還全是英文的”中文文檔“ ,laravel恰好在4.2版本中剛剛引入了redis作為隊(duì)列存儲,這是一個(gè)非常好的消息。OK,背景介紹到這里,下面扯扯干貨。

laravel中的隊(duì)列服務(wù)跟其他隊(duì)列服務(wù)也沒有什么不同,都是最符合人類思維的最簡單最普遍的流程:有一個(gè)地方存放隊(duì)列信息,一個(gè)PHP進(jìn)程在運(yùn)行時(shí)將任務(wù)寫入,另外一個(gè)PHP守護(hù)進(jìn)程輪詢隊(duì)列信息,將達(dá)到執(zhí)行要求的任務(wù)執(zhí)行并刪除。由于PHP是url驅(qū)動的同步語言,本身是阻塞的,所以laravel提供一個(gè)守護(hù)進(jìn)程工具來查詢并執(zhí)行隊(duì)列信息也就不足為奇了。

Laravel的queue配置文件是 /app/config/queue.php,在 Default Queue Driver 這一項(xiàng)中,可以選擇"sync", "beanstalkd", "sqs", "iron", "redis" 五種驅(qū)動器。

1. sync是本地調(diào)試用的同步驅(qū)動器

2. beanstalkd 是一個(gè)專業(yè)隊(duì)列服務(wù)驅(qū)動器:http://kr.github.io/beanstalkd/

3. sqs和iron是國外第三方隊(duì)列服務(wù)

4. 最后一項(xiàng)redis給了我們一個(gè)使用redis的理由,這樣我們順便把緩存服務(wù)和session服務(wù)全部遷移到redis上了。

0. 順便說一句,session驅(qū)動器千萬別用mysql,處理時(shí)間1S不是夢,哎,看誰呢,說的就是你,1S哥!

隊(duì)列服務(wù)需要專門新建任務(wù)類,作為獨(dú)立類,他們不需要繼承類,因?yàn)殛?duì)列里的任務(wù)在執(zhí)行的時(shí)候,是由PHP守護(hù)進(jìn)程來獨(dú)立調(diào)用的,當(dāng)然如果你要use一下別的類再調(diào)用,也不會出錯。之前我把很多額外服務(wù)獨(dú)立到了一個(gè)單獨(dú)的文件夾 /app/services 里,比如輸入信息驗(yàn)證 validator,特殊安全驗(yàn)證模塊等,這次queue類們就位于其中。

queue的使用非常簡單,下面就是一個(gè)簡單的示例:

復(fù)制代碼 代碼如下:

use Queue;
Queue::push('CurlJsonQueue', [
 'url' => $url,
 'json' => $json
]);

這就是一個(gè)標(biāo)準(zhǔn)的queue壓入流程了。當(dāng)然,在這里我把CurlJsonQueue類放到了services根目錄下,這個(gè)目錄已經(jīng)被我注冊到composer.json的"autoload"的"classmap"中,是位于頂層命名空間中的,可以直接調(diào)用,如果需要調(diào)用非頂層命名空間,是可以寫 App\OOXX 的。我們的系統(tǒng)需要大量和微信服務(wù)器交互,所以就獨(dú)立出來了這個(gè)類。

復(fù)制代碼 代碼如下:

<?php

class CurlJsonQueue extends BaseController{

 public function fire($job, $data)
 {
  $url = $data['url'];
  $json = $data['json'];

  parent::base_post_curl($url, $json);

  $job->delete();
 }
}

這個(gè)類默認(rèn)的方法是 fire() ,參數(shù)也是固定的兩個(gè) $job 和 $data,由于我在BaseController中封裝了post的curl模塊,所以就調(diào)用了一下。另外這里還有一個(gè)小坑,當(dāng)時(shí)寫base_post_curl() 的時(shí)候用的protected,導(dǎo)致use BaseController無效,必須繼承。

通過執(zhí)行上面的代碼,queue中就被放入了一個(gè)新的任務(wù),laravel通過下面的命令開啟守護(hù)進(jìn)程:

復(fù)制代碼 代碼如下:

php artisan queue:listen

然后守護(hù)進(jìn)程就開始處理隊(duì)列了。此代碼中的PHP命令和artisan文件的路徑請自行調(diào)整。

大家可能注意到了,我們要使用的這個(gè)隊(duì)列系統(tǒng)用到了redis和PHP命令行,如果在測試環(huán)境,加個(gè)開機(jī)啟動甚至是手動啟動都可以,但是在生產(chǎn)環(huán)境就需要更穩(wěn)固的工具來守護(hù)這兩個(gè)程序,我們用的是supervisor,關(guān)于supervisor的安裝配置大家可以參考這篇文章: http://blog.segmentfault.com/qianfeng/1190000000532561 注意,文章里有小坑請自行去踩。。。

OK,全部配置好之后,跑起來redis和PHP命令行,整個(gè)系統(tǒng)就開始愉快地運(yùn)行啦~

使用感受:

隊(duì)列服務(wù)超好用,之前一次和app的交互流程需要6-7S,異步以后降低到2S以內(nèi),基本就是傳輸時(shí)間和PHP代碼運(yùn)行時(shí)間了,耗時(shí)的特殊操作已經(jīng)異步了。不過隊(duì)列服務(wù)默認(rèn)1S開一個(gè)進(jìn)程檢查一次redis中有沒有可以運(yùn)行的服務(wù),在阿里云服務(wù)器上,大約能占到單核的10%,消耗略大,而且隊(duì)列處理時(shí)間相對較長,因?yàn)闆]有了之前同步時(shí)候的文件加載福利。不過如果有多個(gè)任務(wù),PHP進(jìn)程是會連續(xù)執(zhí)行的,不會1S執(zhí)行一個(gè)的啦。

下面說說坑:

1. 由于queue核心類使用了一個(gè)特殊函數(shù),導(dǎo)致沒有明確類型的變量會以單元素?cái)?shù)組的形式存進(jìn)json,再存進(jìn)redis。解決辦法就是在每一個(gè)要放進(jìn)去的數(shù)據(jù)前面加上 ''. 。上面的$url和$json由于都已經(jīng)在前面用引號進(jìn)行了類型申明,故沒做這一步操作。

2. 如果要傳遞url給隊(duì)列,系統(tǒng)queue類會在每一個(gè) / 前面加上兩個(gè) \\ 。這對于一些特殊操作可能會造成致命影響。(開玩笑,有上面那個(gè)致命么?。?/p>

相關(guān)文章

  • 如何使用Gitblog和Markdown建自己的博客

    如何使用Gitblog和Markdown建自己的博客

    這篇文章主要交大家如何使用Gitblog和Markdown建自己的博客,如何大家擁有服務(wù)器或者云平臺提供的云主機(jī),我推薦大家使用Linux+ Nginx 來運(yùn)行Gitblog,如果大家目前只有Apache環(huán)境也可以,需要的朋友可以參考下
    2015-07-07
  • Discuz論壇標(biāo)題和底部去掉版權(quán)信息實(shí)例講解

    Discuz論壇標(biāo)題和底部去掉版權(quán)信息實(shí)例講解

    這篇文章主要介紹了Discuz論壇標(biāo)題和底部去掉版權(quán)信息實(shí)例講解,有正好遇到這個(gè)問題但是不知道修改哪個(gè)文件的同學(xué)可以跟著操作下,可以節(jié)省很多不必要的時(shí)間
    2021-03-03
  • JSON用法之將PHP數(shù)組轉(zhuǎn)JS數(shù)組,JS如何接收PHP數(shù)組

    JSON用法之將PHP數(shù)組轉(zhuǎn)JS數(shù)組,JS如何接收PHP數(shù)組

    這篇文章主要介紹了JSON用法之將PHP數(shù)組轉(zhuǎn)JS數(shù)組,JS如何接收PHP數(shù)組的相關(guān)資料,需要的朋友可以參考下
    2015-10-10
  • 通過5個(gè)php實(shí)例細(xì)致說明傳值與傳引用的區(qū)別

    通過5個(gè)php實(shí)例細(xì)致說明傳值與傳引用的區(qū)別

    今天有個(gè)同事問我傳值和傳引用有什么不同,這讓我想起了,剛學(xué)php的時(shí)候,那個(gè)時(shí)候做過很多項(xiàng)目,做東西多,就以為自己php掌握的差不多了,隨著時(shí)間的推移,越深入的學(xué)習(xí),越覺得自己知道的真的很少,很少
    2012-08-08
  • 詳解php如何對數(shù)組進(jìn)行排序

    詳解php如何對數(shù)組進(jìn)行排序

    這篇文章主要為大家詳細(xì)介紹了php如何對數(shù)組進(jìn)行排序,合并,截取替換等操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2023-09-09
  • php使用fullcalendar日歷插件詳解

    php使用fullcalendar日歷插件詳解

    這篇文章主要介紹了php使用fullcalendar日歷插件的教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Thinkphp5框架使用validate實(shí)現(xiàn)驗(yàn)證功能的方法

    Thinkphp5框架使用validate實(shí)現(xiàn)驗(yàn)證功能的方法

    這篇文章主要介紹了Thinkphp5框架使用validate實(shí)現(xiàn)驗(yàn)證功能的方法,結(jié)合實(shí)例形式分析了tp5內(nèi)置的對象validate實(shí)現(xiàn)驗(yàn)證的相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • php對數(shù)組排序代碼分享

    php對數(shù)組排序代碼分享

    這篇文章主要介紹了php對數(shù)組排序代碼,需要的朋友可以參考下
    2014-02-02
  • PHP 面向?qū)ο蟪绦蛟O(shè)計(jì)(oop)學(xué)習(xí)筆記 (四) - 異常處理類Exception

    PHP 面向?qū)ο蟪绦蛟O(shè)計(jì)(oop)學(xué)習(xí)筆記 (四) - 異常處理類Exception

    異常經(jīng)常被用來處理一些在程序正常執(zhí)行中遇到的各種類型的錯誤。比如做數(shù)據(jù)庫鏈接時(shí),你就要處理數(shù)據(jù)庫連接失敗的情況。使用異常可以提高我們程序的容錯特性,從而使我們的應(yīng)用程序更加的穩(wěn)定和健壯。
    2014-06-06
  • Laravel框架使用Redis的方法詳解

    Laravel框架使用Redis的方法詳解

    這篇文章主要介紹了Laravel框架使用Redis的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Laravel框架中Redis數(shù)據(jù)庫配置、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-05-05

最新評論

鲁山县| 寻甸| 阿克陶县| 虎林市| 全州县| 徐州市| 彩票| 永嘉县| 女性| 寿宁县| 秦安县| 同德县| 宁陵县| 开远市| 大石桥市| 资讯 | 喀喇| 北京市| 清水县| 福海县| 友谊县| 阿鲁科尔沁旗| 开封县| 广宗县| 文山县| 漯河市| 延川县| 开鲁县| 柘荣县| 定日县| 安庆市| 手机| 云梦县| 尤溪县| 麻栗坡县| 和静县| 大安市| 海盐县| 东乡族自治县| 肇东市| 霸州市|