佇列
設置
Laravel 對不同的佇列服務提供了統一的 API,佇列讓你可以延遲處理需要花費時間處理的任務,像是延遲寄送郵件,進而大幅加快應用程式的存取速度。
佇列的設定檔放在 app/config/queue.php
,在設定檔中可以找到 Laravel 支援的佇列服務連線設定,像是 Beanstalkd 、 IronMQ 、 Amazon SQS 及同步處理 (在本地端使用) 驅動。
下列是佇列驅動所相依的套件:
- Beanstalkd:
pda/pheanstalk
- Amazon SQS:
aws/aws-sdk-php
- IronMQ:
iron-io/iron_mq
基本使用
使用 Queue::push
方法推送一個新的任務到佇列中:
推送任務到佇列
Queue::push('SendEmail', array('message' => $message));
傳送給 push
方法的第一個參數是用來處理這個佇列任務處理器的類別名稱,第二個參數是傳送給處理器處理的陣列資料,佇列任務處理器會被定義成像這樣:
定義一個佇列任務處理器
class SendEmail {
public function fire($job, $data)
{
//
}
}
注意,佇列任務處理器只需要 fire
方法,fire
方法會接收一個 任務
實例,就像推送 處理資料
到佇列一樣。
你如果希望佇列任務處理器使用 fire
以外的方法去處理,你可以在推送資料給處理器時,去指定想要用來執行的方法:
指定自訂的處理器方法
Queue::push('SendEmail@send', array('message' => $message));
在你處理完佇列任務後,必須要將任務從佇列中刪除,可以在 任務
實例中使用 delete
方法來達到這個目的:
刪除被處理過的任務
public function fire($job, $data)
{
// Process the job...
$job->delete();
}
使用 release
方法可以將任務放回佇列:
將任務放回佇列
public function fire($job, $data)
{
// Process the job...
$job->release();
}
你也可以指定要延遲幾秒再將任務放回佇列:
$job->release(5);
如果在處理佇列任務時發生異常狀況,則任務將會自動放回佇列中,你可以用 attempts
方法去取得任務被嘗試處理的次數:
檢查任務被嘗試處理的次數
if ($job->attempts() > 3)
{
//
}
你也可以使用 getJobId
方法去取得任務的編號:
存取任務編號
$job->getJobId();
佇列閉合
你也可以推送閉合凾式到佇列中,這是相當方便且快速、簡單的處理佇列任務:
推送閉合凾式到佇列
Queue::push(function($job) use ($id)
{
Account::delete($id);
$job->delete();
});
注意: 當推送閉合函式到佇列中,不應該使用
__DIR__
及__FILE__
常數
當你使用 Iron.io 推送佇列 ,你應該做額外的閉合函式佇列預防措施,在接收佇列訊息時應該要檢查請求的標記 (token) 是否真的是來自 Iron.io ,舉例來說,你推送到佇列訊息的結尾應該要長得像這樣: https://yourapp.com/queue/receive?token=SecretToken
,你可以在安排處理佇列時檢查標記是否合法。
執行佇列傾聽器
Laravel 包含了 Artisan 佇列任務的指令,可以去執行新的推送到佇列的任務,你可以使用 queue:listen
指令去執行這個功能:
開啟佇列傾聽器
php artisan queue:listen
你可以指定佇列傾聽器要使用哪一個連結:
php artisan queue:listen connection
注意,一但佇列傾聽器任務啟動,除非手動停止,否則將會持續的做佇列傾聽的動作,你可以使用 Supervisor 監看工具去確認佇列傾聽器的執行狀況。
你也可以設定每個佇列傾聽器任務的執行時間 (秒):
指定佇列傾聽器任務的執行時間
php artisan queue:listen --timeout=60
使用 queue:work
指令去執行在佇列的第一個任務:
處理在佇列的第一個任務
php artisan queue:work
推送佇列
推送佇列讓你可以在沒有執行任何自動執行或背景執行的傾聽器時,使用 Laravel 的強大的佇列工具,現在推送佇列只支援 Iron.io 驅動,在開始使用佇列之前,必須先建立 Iron.io 帳號,並把帳號相關驗證資訊設定寫到 app/config/queue.php
設定檔中。
接下來你可以在 Artisan 指令使用 queue:subscribe
指令去註冊一個接收佇列任務的應用程式網址:
註冊推送佇列訂閱器
php artisan queue:subscribe queue_name http://foo.com/queue/receive
當你現在去登入 Iron 後台,你會看到一個新的推送佇列及訂閱的網址,你可以訂閱任何想要推送到佇列的網址,接下來,建立一個路由到 queue/receive
,並回傳 Queue::marshal
方法的回應:
Route::post('queue/receive', function()
{
return Queue::marshal();
});
marshal
方法會自動執行正確的任務處理類別,若想要將任務推送到佇列,只要用原本的相同的 Queue::push
方法即可。