佇列
設置
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 方法即可。
