回到最上方

文件

佇列

設置

Laravel 對不同的佇列服務提供了統一的 API,佇列讓你可以延遲處理需要花費時間處理的任務,像是延遲寄送郵件,進而大幅加快應用程式的存取速度。

佇列的設定檔放在 app/config/queue.php,在設定檔中可以找到 Laravel 支援的佇列服務連線設定,像是 BeanstalkdIronMQAmazon 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 方法即可。

討論