yii2-queue一個好用的yii2隊列操作擴展

yii2-queue

a yii2 extension to make simple to use queue.

yii2-queue讓隊列的使用在yii2中變得更輕鬆,她爲各種隊列組件的使用提供了一個標準的接口,您只需要配置好需要使用的隊列組件,就能輕鬆使用, 同時您在不同隊列組件之間的切換也只需要修改下配置文件,重啓下隊列監聽進程即可,目前支持數據庫隊列,redis隊列,beanstalkd隊列, 其它隊列中間件支持正在添加中(當然,聰明的你也可以自行擴展)。

Installation

The preferred way to install this extension is through composer.

Either run

php composer.phar require --prefer-dist shmilyzxt/yii2-queue "dev-master"

or add

"shmilyzxt/yii2-queue": "dev-master"

to the require section of your composer.json file.

Usage

1:在配置文件中配置好需要使用的隊列,完整的配置代碼如下:

數據庫隊列

'queue' => [
            'class' => 'shmilyzxt\queue\queues\DatabaseQueue', //隊列使用的類
            'jobEvent' => [ //隊列任務事件配置,目前任務支持2個事件
                'on beforeExecute' => ['shmilyzxt\queue\base\JobEventHandler','beforeExecute'],
                'on beforeDelete' => ['shmilyzxt\queue\base\JobEventHandler','beforeDelete'],
            ],
            'connector' => [//隊列中間件鏈接器配置(這是因爲使用數據庫,所以使用yii\db\Connection作爲數據庫鏈接實例)
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
                'username' => 'root',
                'password' => '',
                'charset' => 'utf8',
            ],
            'table' => 'jobs', //存儲隊列數據表名
            'queue' => 'default', //隊列的名稱
            'expire' => 60, //任務過期時間
            'maxJob' =>0, //隊列允許最大任務數,0爲不限制
            'failed' => [//任務失敗日誌記錄(目前只支持記錄到數據庫)
                'logFail' => true, //開啓任務失敗處理
                'provider' => [ //任務失敗處理類
                    'class' => 'shmilyzxt\queue\failed\DatabaseFailedProvider',
                    'db' => [ //數據庫鏈接
                        'class' => 'yii\db\Connection',
                        'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
                        'username' => 'root',
                        'password' => '',
                        'charset' => 'utf8',
                    ],
                    'table' => 'failed_jobs' //存儲失敗日誌的表名
                ],
            ],
        ]

redis隊列

'queue' => [
            'class' => 'shmilyzxt\queue\queues\RedisQueue',
            'jobEvent' => [
                'on beforeExecute' => ['shmilyzxt\queue\base\JobEventHandler','beforeExecute'],
                'on beforeDelete' => ['shmilyzxt\queue\base\JobEventHandler','beforeDelete'],
            ],
            'connector' => [ //需要安裝 predis\predis 擴展來操作redis
                'class' => 'shmilyzxt\queue\connectors\PredisConnector',
                'parameters' => [
                    'scheme' => 'tcp',
                    'host' => '127.0.0.1',
                    'port' => 6379,
                    //'password' => '1984111a',
                    'db' => 0
                ],
                'options'=> [],
            ],
            'queue' => 'default',
            'expire' => 60,
            'maxJob' => 0,
            'failed' => [
                'logFail' => true,
                'provider' => [
                    'class' => 'shmilyzxt\queue\failed\DatabaseFailedProvider',
                    'db' => [
                        'class' => 'yii\db\Connection',
                        'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
                        'username' => 'root',
                        'password' => '',
                        'charset' => 'utf8',
                    ],
                    'table' => 'failed_jobs'
                ],
            ],
        ]

beanstalkd隊列

'queue' => [
            'class' => 'shmilyzxt\queue\queues\BeanstalkdQueue',
            'jobEvent' => [
                'on beforeExecute' => ['shmilyzxt\queue\base\JobEventHandler','beforeExecute'],
                'on beforeDelete' => ['shmilyzxt\queue\base\JobEventHandler','beforeDelete'],
            ],
            'connector' => [ //需要安裝 pad\pheanstalk 擴展來操作beastalkd
                'class' => 'shmilyzxt\queue\connectors\PheanstalkConnector',
                'host' => '114.55.142.6',
                'port' => 11300
            ],
            'queue' => 'default',
            'expire' => 60,
            'maxJob' => 0,
            'failed' => [
                'logFail' => true,
                'provider' => [
                    'class' => 'shmilyzxt\queue\failed\DatabaseFailedProvider',
                    'db' => [
                        'class' => 'yii\db\Connection',
                        'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
                        'username' => 'root',
                        'password' => '',
                        'charset' => 'utf8',
                    ],
                    'table' => 'failed_jobs'
                ],
            ],
        ],

2:在components數組配置項中配置好隊列後,就可以開始使用隊列了,首先是任務入隊列,提供兩個方法: \Yii::app>queue>pushOn(app->queue->pushOn(hander,data,data,queue=‘default’) 即時任務入隊列:這樣的任務入隊列後,如果隊列監聽在運行,那麼任務會立刻進入ready狀態,可以被監聽進程執行。 該方法有3個參數,第一個爲任務處理handler,第二個爲任務數據,第三個爲隊列名稱,默認爲 default。 \Yii::app>queue>laterOn(app->queue->laterOn(delay,handler,handler,data,$queue=‘default’) 延時任務入隊列:這樣的任務入隊列後不會立刻被隊列監聽進程之行,需要等待 $delay秒後任務才就緒。

目前支持的handler有: 1,新建自己的隊列處理handler,繼承、shmilyzxt\queue\base\JobHandler,並實現任務處理方法handle()和失敗處理方法failed()。 2, 一個php閉包,形如 function(job,job,data){}

\Yii::$app->queue->pushOn(new SendMial(),['email'=>'[email protected]','title'=>'test','content'=>'email test'],'email');
\Yii::$app->queue->pushOn(function($job,$data){var_dump($data)},['email'=>'[email protected]','title'=>'test','content'=>'email test'],'email');

\Yii::$app->queue->laterOn(120,new SendMial(),['email'=>'[email protected]','title'=>'test','content'=>'email test'],'email');
\Yii::$app->queue->pushOn(120,function($job,$data){var_dump($data)},['email'=>'[email protected]','title'=>'test','content'=>'email test'],'email');

3:新建自己的隊列處理handler,繼承shmilyzxt\queue\base\JobHandler,並實現任務處理方法handle和失敗處理方法failed,一個發郵件的jobhandler類似:

class SendMail extends JobHandler
{

    public function handle($job,$data)
    {
        if($job->getAttempts() > 3){
            $this->failed($job);
        }

        $payload = $job->getPayload();

        //$payload即任務的數據,你拿到任務數據後就可以執行發郵件了
        //TODO 發郵件
    }

    public function failed($job,$data)
    {
        die("發了3次都失敗了,算了");
    }
}

4:啓動後臺隊列監聽進程,對任務進行處理,您可以使用yii console app來啓動,你也可以使用更高級的如swoole來高效的運行隊列監聽, 目前提供了一個Worker類,在控制檯程序使用Worker::listen(Queue queue,queue,queueName=‘default’,attempt=10,attempt=10,memory=512,sleep=3,sleep=3,delay=0)可以 啓動隊列監聽進程,其中 attemptattempt是任務嘗試次數,memory是允許使用最大內存,sleepsleep表示每次嘗試從隊列中獲取任務的間隔時間,delay代表把任務重新加入隊列 時是否延時(0代表不延時),一個標準yii console app 啓動隊列監聽進程代碼如下;

class WorkerController extends \yii\console\Controller
{
    public function actionListen($queueName='default',$attempt=10,$memeory=128,$sleep=3 ,$delay=0){
        Worker::listen(\Yii::$app->queue,$queueName,$attempt,$memeory,$sleep,$delay);
    }
}
yii worker/listen default 10 128 3 0

當後臺監聽任務啓動起來後,一但有任務加入隊列,隊列就會調用入隊列時設置的handler對隊列任務進行處理了。每次會pop出一個任務進行處理,處理完成後刪除任務,直到隊列爲空。

5:關於任務失敗處理: 默認情況下,一個任務在執行時出現異常或者一個任務失敗時並不是認爲它真正失敗了,此時會檢測它的嘗試次數是否已經超出設置的attempt,如果沒超出會重新入隊列嘗試,如果超出了, 則該任務纔是真正失敗,這是會先調用任務處理handler類的failed()方法處理失敗操作,如果沒有failed()方法(比如handler爲閉包或者您自定義的繼承自shmilyzxt\queue\base\JobHandler 的類沒有寫failed()方法),則會嘗試使用擴展自身的失敗日誌處理機制(配置項裏的failed配置),會嘗試把失敗任務的詳細信息寫入到數據庫表中(目前只支持數據庫方式)。 建議您採用繼承shmilyzxt\queue\base\JobHandler的方式生成任務處理handler並寫自己的failed方法處理失敗任務。

6:任務事件支持: 目前任務支持2個事件(beforeExecute,beforeDelete), beforeExecute是在任務被pop出來之後,執行之前執行。beforeDelete是任務在被刪除之前執行 您可以使用這兩個事件做自定易操作,只需要像上面配置文件裏配置 jobEvent那樣綁定事件處理handler即可 1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章