yii2.0 中的隊列


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'
],
],
],


activeMQ配置如下:
'queue' => [

'class' => 'shmilyzxt\queue\queues\ActivemqQueue',
'jobEvent' => [
'on beforeExecute' => ['shmilyzxt\queue\base\JobEventHandler','beforeExecute'],
'on beforeDelete' => ['shmilyzxt\queue\base\JobEventHandler','beforeDelete'],
],
'connector' => [
'class' => 'shmilyzxt\queue\connectors\ActivemqConnector',
'broker' => 'tcp://127.0.0.1:61613',
'timeout' => 10
],
'queue' => 'default',
'expire' => 60,
'maxJob' => 0,
'failed' => [
'logFail' => true,
'provider' => [
'class' => 'shmilyzxt\queue\failed\FileFaildProvider',//文件錯誤日志
'filePath' => 'D://xampp/htdocs/advanced/vendor/shmilyzxt/yii2-queue/failed/log/failed.log',
],
],
]
2:在components數組配置項中配置好隊列后,就可以開始使用隊列了,首先是任務入隊列,提供兩個方法:
\Yii::$app->queue->pushOn($hander,$data,$queue='default')
即時任務入隊列:這樣的任務入隊列后,如果隊列監聽在運行,那么任務會立刻進入ready狀態,可以被監聽進程執行。
該方法有3個參數,第一個為任務處理handler,第二個為任務數據,第三個為隊列名稱,默認為 default。
\Yii::$app->queue->laterOn($delay,$handler,$data,$queue='default')
延時任務入隊列:這樣的任務入隊列后不會立刻被隊列監聽進程之行,需要等待 $delay秒后任務才就緒。

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

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

\Yii::$app->queue->laterOn(120,new SendMial(),['email'=>'49783121@qq.com','title'=>'test','content'=>'email test'],'email');
\Yii::$app->queue->pushOn(120,function($job,$data){var_dump($data)},['email'=>'49783121@qq.com','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,$queueName='default',$attempt=10,$memory=512,$sleep=3,$delay=0)可以
啟動隊列監聽進程,其中 $attempt是任務嘗試次數,$memory是允許使用最大內存,$sleep表示每次嘗試從隊列中獲取任務的間隔時間,$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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM