127.0.0.1 zxt.php_shmilyzxt/
README
A yii2 extension to make simple to use queue.
yii2-queue讓隊(duì)列的使用在yii2中變得更輕松,她為各種隊(duì)列組件的使用提供了一個(gè)標(biāo)準(zhǔn)的接口,您只需要配置好需要使用的隊(duì)列組件,就能輕松使用,
同時(shí)您在不同隊(duì)列組件之間的切換也只需要修改下配置文件,重啟下隊(duì)列監(jiān)聽進(jìn)程即可,目前支持?jǐn)?shù)據(jù)庫隊(duì)列,redis隊(duì)列,beanstalkd隊(duì)列,
其它隊(duì)列中間件支持正在添加中(當(dāng)然,聰明的你也可以自行擴(kuò)展)。
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:在配置文件中配置好需要使用的隊(duì)列,完整的配置代碼如下:
數(shù)據(jù)庫隊(duì)列
'queue' => [
'class' => 'shmilyzxt\queue\queues\DatabaseQueue', //隊(duì)列使用的類
'jobEvent' => [ //隊(duì)列任務(wù)事件配置,目前任務(wù)支持2個(gè)事件
'on beforeExecute' => ['shmilyzxt\queue\base\JobEventHandler','beforeExecute'],
'on beforeDelete' => ['shmilyzxt\queue\base\JobEventHandler','beforeDelete'],
],
'connector' => [//隊(duì)列中間件鏈接器配置(這是因?yàn)槭褂脭?shù)據(jù)庫,所以使用yii\db\Connection作為數(shù)據(jù)庫鏈接實(shí)例)
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
'table' => 'jobs', //存儲隊(duì)列數(shù)據(jù)表名
'queue' => 'default', //隊(duì)列的名稱
'expire' => 60, //任務(wù)過期時(shí)間
'maxJob' =>0, //隊(duì)列允許最大任務(wù)數(shù),0為不限制
'failed' => [//任務(wù)失敗日志記錄(目前只支持記錄到數(shù)據(jù)庫)
'logFail' => true, //開啟任務(wù)失敗處理
'provider' => [ //任務(wù)失敗處理類
'class' => 'shmilyzxt\queue\failed\DatabaseFailedProvider',
'db' => [ //數(shù)據(jù)庫鏈接
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
'table' => 'failed_jobs' //存儲失敗日志的表名
],
],
]
redis隊(duì)列
'queue' => [
'class' => 'shmilyzxt\queue\queues\RedisQueue',
'jobEvent' => [
'on beforeExecute' => ['shmilyzxt\queue\base\JobEventHandler','beforeExecute'],
'on beforeDelete' => ['shmilyzxt\queue\base\JobEventHandler','beforeDelete'],
],
'connector' => [ //需要安裝 predis\predis 擴(kuò)展來操作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隊(duì)列
'queue' => [
'class' => 'shmilyzxt\queue\queues\BeanstalkdQueue',
'jobEvent' => [
'on beforeExecute' => ['shmilyzxt\queue\base\JobEventHandler','beforeExecute'],
'on beforeDelete' => ['shmilyzxt\queue\base\JobEventHandler','beforeDelete'],
],
'connector' => [ //需要安裝 pad\pheanstalk 擴(kuò)展來操作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數(shù)組配置項(xiàng)中配置好隊(duì)列后,就可以開始使用隊(duì)列了,首先是任務(wù)入隊(duì)列,提供兩個(gè)方法:
\Yii::$app->queue->pushOn($hander,$data,$queue='default')
即時(shí)任務(wù)入隊(duì)列:這樣的任務(wù)入隊(duì)列后,如果隊(duì)列監(jiān)聽在運(yùn)行,那么任務(wù)會立刻進(jìn)入ready狀態(tài),可以被監(jiān)聽進(jìn)程執(zhí)行。
該方法有3個(gè)參數(shù),第一個(gè)為任務(wù)處理handler,第二個(gè)為任務(wù)數(shù)據(jù),第三個(gè)為隊(duì)列名稱,默認(rèn)為 default。
\Yii::$app->queue->laterOn($delay,$handler,$data,$queue='default')
延時(shí)任務(wù)入隊(duì)列:這樣的任務(wù)入隊(duì)列后不會立刻被隊(duì)列監(jiān)聽進(jìn)程之行,需要等待 $delay秒后任務(wù)才就緒。
目前支持的handler有:
1,新建自己的隊(duì)列處理handler,繼承、shmilyzxt\queue\base\JobHandler,并實(shí)現(xiàn)任務(wù)處理方法handle()和失敗處理方法failed()。
2, 一個(gè)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:新建自己的隊(duì)列處理handler,繼承shmilyzxt\queue\base\JobHandler,并實(shí)現(xiàn)任務(wù)處理方法handle和失敗處理方法failed,一個(gè)發(fā)郵件的jobhandler類似:
class SendMail extends JobHandler
{
public function handle($job,$data)
{
if($job->getAttempts() > 3){
$this->failed($job);
}
$payload = $job->getPayload();
//$payload即任務(wù)的數(shù)據(jù),你拿到任務(wù)數(shù)據(jù)后就可以執(zhí)行發(fā)郵件了
//TODO 發(fā)郵件
}
public function failed($job,$data)
{
die("發(fā)了3次都失敗了,算了");
}
}
4:啟動后臺隊(duì)列監(jiān)聽進(jìn)程,對任務(wù)進(jìn)行處理,您可以使用yii console app來啟動,你也可以使用更高級的如swoole來高效的運(yùn)行隊(duì)列監(jiān)聽,
目前提供了一個(gè)Worker類,在控制臺程序使用Worker::listen(Queue $queue,$queueName='default',$attempt=10,$memory=512,$sleep=3,$delay=0)可以
啟動隊(duì)列監(jiān)聽進(jìn)程,其中 $attempt是任務(wù)嘗試次數(shù),$memory是允許使用最大內(nèi)存,$sleep表示每次嘗試從隊(duì)列中獲取任務(wù)的間隔時(shí)間,$delay代表把任務(wù)重新加入隊(duì)列
時(shí)是否延時(shí)(0代表不延時(shí)),一個(gè)標(biāo)準(zhǔn)yii console app 啟動隊(duì)列監(jiān)聽進(jìn)程代碼如下;
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
當(dāng)后臺監(jiān)聽任務(wù)啟動起來后,一但有任務(wù)加入隊(duì)列,隊(duì)列就會調(diào)用入隊(duì)列時(shí)設(shè)置的handler對隊(duì)列任務(wù)進(jìn)行處理了。每次會pop出一個(gè)任務(wù)進(jìn)行處理,處理完成后刪除任務(wù),直到隊(duì)列為空。
5:關(guān)于任務(wù)失敗處理:
默認(rèn)情況下,一個(gè)任務(wù)在執(zhí)行時(shí)出現(xiàn)異常或者一個(gè)任務(wù)失敗時(shí)并不是認(rèn)為它真正失敗了,此時(shí)會檢測它的嘗試次數(shù)是否已經(jīng)超出設(shè)置的attempt,如果沒超出會重新入隊(duì)列嘗試,如果超出了,
則該任務(wù)才是真正失敗,這是會先調(diào)用任務(wù)處理handler類的failed()方法處理失敗操作,如果沒有failed()方法(比如handler為閉包或者您自定義的繼承自shmilyzxt\queue\base\JobHandler
的類沒有寫failed()方法),則會嘗試使用擴(kuò)展自身的失敗日志處理機(jī)制(配置項(xiàng)里的failed配置),會嘗試把失敗任務(wù)的詳細(xì)信息寫入到數(shù)據(jù)庫表中(目前只支持?jǐn)?shù)據(jù)庫方式)。
建議您采用繼承shmilyzxt\queue\base\JobHandler的方式生成任務(wù)處理handler并寫自己的failed方法處理失敗任務(wù)。
6:任務(wù)事件支持:
目前任務(wù)支持2個(gè)事件(beforeExecute,beforeDelete), beforeExecute是在任務(wù)被pop出來之后,執(zhí)行之前執(zhí)行。beforeDelete是任務(wù)在被刪除之前執(zhí)行
您可以使用這兩個(gè)事件做自定易操作,只需要像上面配置文件里配置 jobEvent那樣綁定事件處理handler即可 1。
總結(jié)
以上是生活随笔為你收集整理的127.0.0.1 zxt.php_shmilyzxt/的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广东未来科技:书写立体显示事业传奇的行业
- 下一篇: Qt学习之Windows下Qt应用程序打