溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

queue隊列服務如何在Laravel 4.2 中使用

發(fā)布時間:2020-12-10 14:39:39 來源:億速云 閱讀:154 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章給大家介紹queue隊列服務如何在Laravel 4.2 中使用,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

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

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

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

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

3. sqs和iron是國外第三方隊列服務

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

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

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

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

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

<&#63;php

class CurlJsonQueue extends BaseController{

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

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

  $job->delete();
 }
}

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

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

復制代碼 代碼如下:

php artisan queue:listen

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

大家可能注意到了,我們要使用的這個隊列系統(tǒng)用到了redis和PHP命令行,如果在測試環(huán)境,加個開機啟動甚至是手動啟動都可以,但是在生產(chǎn)環(huán)境就需要更穩(wěn)固的工具來守護這兩個程序,我們用的是supervisor

使用感受:

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

下面說說坑:

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

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

關(guān)于queue隊列服務如何在Laravel 4.2 中使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI