亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

Yii2 隊列 shmilyzxt/yii2-queue 簡單概述

2024-05-04 23:59:08
字體:
來源:轉載
供稿:網友

shmilyzxt/yii2-queue 簡單解釋:

1.我用的yii2高級版,我們從配置開始看代碼,這里我用的是mysql隊列,首先配置文件,我把queue配置項寫在根目錄common/config/main-local.php下的 components數組下,更改一下數據庫配置.復制composer安裝后復制

vendor/shmilyzxt/yii2-queue/jobs/jobs.sqlvendor/shmilyzxt/yii2-queue/failed/failed.sql

2個sql文件到數據庫中建立隊列數據表和執行任務失敗時的數據表.

2.推送任務開始語法:/Yii::$app->queue->pushOn(new SendMial(),['email'=>'49783121@qq.com','title'=>'test','content'=>'email test'],'email'); 我們到vendor/shmilyzxt/queue/queues/DatabaseQueue.php去看看代碼,pushOn()方法寫在了DatabaseQueue類的父類vendor/shmilyzxt/queue/base/Queue.php中:

//入隊列public function pushOn($job, $data = '', $queue = null) { //canPush 檢查隊列是否已達最大任務量 if ($this->canPush()) {   //beforePush 入隊列前的事件  $this->trigger(self::EVENT_BEFORE_PUSH);   //入隊列  $ret = $this->push($job, $data, $queue);  //afterPush 入隊列后的事件  $this->trigger(self::EVENT_AFTER_PUSH);  return $ret; } else {  throw new /Exception("max jobs number exceed! the max jobs number is {$this->maxJob}"); } }

注釋:這里最好去看看yii2 event事件類,http://www.digpage.com/event.html

關于入隊列: $this->push($job, $data, $queue);,這里在配合queue類文件查看,相關函數跳轉,處理一下數據記錄到數據庫中.(函數走向:getQueue()-->createPayload()-->pushToDatabase()),pushOn()最終返回數據插入數據庫的結果,成功$ret是1.

3.后臺運行命令處理隊列,例:php ./yii worker/listen default 10 128 3 0 其中default是隊列的名稱,上面推送了一個email隊列 應該改為email.

啟動命令后,我們來看代碼:首先執行:WorkerController控制器 actionListen方法,我們跟著代碼進入到 vendor/shmilyzxt/queue/Worker.php -- listen方法中,這里其實就是一直在循環,執行操作隊列的任務:

/** * 啟用一個隊列后臺監聽任務 * @param Queue $queue * @param string $queueName 監聽隊列的名稱(在pushon的時候把任務推送到哪個隊列,則需要監聽相應的隊列才能獲取任務) * @param int $attempt 隊列任務失敗嘗試次數,0為不限制 * @param int $memory 允許使用的最大內存 * @param int $sleep 每次檢測的時間間隔 */ public static function listen(Queue $queue, $queueName = 'default', $attempt = 10, $memory = 512, $sleep = 3, $delay = 0){ while (true){  try{  //DatabaseQueue從數據庫隊列取出一個可用任務(實例),并且更新任務  $job = $queue->pop($queueName);  }catch (/Exception $e){  throw $e;  continue;  }  if($job instanceof Job){  //判斷執行錯誤的次數是否大于傳入的執行次數  if($attempt > 0 && $job->getAttempts() > $attempt){   $job->failed();  }else{   try{   //throw new /Exception("test failed");   $job->execute();   }catch (/Exception $e){   //執行失敗,判斷是否被刪除,重新入隊   if (! $job->isDeleted()) {    $job->release($delay);   }   }  }  }else{  self::sleep($sleep);  }  if (self::memoryExceeded($memory)) {  self::stop();  } } }

注釋:在$queue->pop($queueName);vendor/shmilyzxt/queue/queues/DatabaseQueue.php方法內使用事務執行SQL,并且創建vendor/shmilyzxt/queue/jobs/DatabaseJob.php的實例

 //取出一個任務 public function pop($queue = null) { $queue = $this->getQueue($queue); if (!is_null($this->expire)) {  //$this->releaseJobsThatHaveBeenReservedTooLong($queue); } $tran = $this->connector->beginTransaction(); //判斷是否有一個可用的任務需要執行 if ($job = $this->getNextAvailableJob($queue)) {  $this->markJobAsReserved($job->id);  $tran->commit();  $config = array_merge($this->jobEvent, [  'class' => 'shmilyzxt/queue/jobs/DatabaseJob',  'queue' => $queue,  'job' => $job,  'queueInstance' => $this,  ]);  return /Yii::createObject($config); } $tran->commit(); return false; }

至于:$job->execute();是DatabaseJob繼承父類Job執行的,順著代碼找下去是yii/base/Component trigger執行的事件,

/** * 執行任務 */public function execute(){ $this->trigger(self::EVENT_BEFORE_EXECUTE, new JobEvent(["job" => $this, 'payload' => $this->getPayload()]));//beforeExecute 執行任務之前的一個事件 在JobEvent中并沒有什么可執行的代碼 $this->resolveAndFire();//真正執行的任務的方法} /** * 真正任務執行方法(調用hander的handle方法) * @param array $payload * @return void */ protected function resolveAndFire() {  $payload = $this->getPayload();  $payload = unserialize($payload); //反序列化數據  $type = $payload['type'];  $class = $payload['job'];  if ($type == 'closure' && ($closure = (new Serializer())->unserialize($class[1])) instanceof /Closure) {   $this->handler = $this->getHander($class[0]);   $this->handler->closure = $closure;   $this->handler->handle($this, $payload['data']);  } else if ($type == 'classMethod') {   $payload['job'][0]->$payload['job'][1]($this, $payload['data']);  } else if ($type == 'staticMethod') {   $payload['job'][0]::$payload['job'][1]($this, $payload['data']);  } else {//執行的`SendMail`類的`handle($job,$data)`方法   $this->handler = $this->getHander($class);   $this->handler->handle($this, $payload['data']);  }  //執行完任務后刪除  if (!$this->isDeletedOrReleased()) {   $this->delete();  } }

最后到了執行的SendMail類的handle($job,$data),在這里就是推送到隊列的對象和數據,接著就是我們的處理邏輯了.

public function handle($job,$data) {  if($job->getAttempts() > 3){   $this->failed($job);  }  $payload = $job->getPayload();  echo '<pre>';print_r($payload);  //$payload即任務的數據,你拿到任務數據后就可以執行發郵件了  //TODO 發郵件 }

總結

以上所述是小編給大家介紹的Yii2 隊列 shmilyzxt/yii2-queue簡介,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!

 

注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
岛国av午夜精品| 国产亚洲精品久久久久久| 日韩黄色高清视频| 亚洲精品日韩丝袜精品| 中文字幕日韩精品在线观看| 亚洲福利在线观看| 97精品久久久中文字幕免费| 欧美成人午夜激情在线| 亚洲欧美国产制服动漫| 久久久久久久久久久久久久久久久久av| 亚洲成人av在线播放| 国产97在线视频| 国产成+人+综合+亚洲欧洲| 久久视频在线看| 欧美疯狂xxxx大交乱88av| 九九热最新视频//这里只有精品| 欧美一级片久久久久久久| 91在线观看免费高清| 91精品国产91久久| 色偷偷亚洲男人天堂| 国产成人激情小视频| 久久视频在线免费观看| 亚洲欧洲第一视频| 欧美成人精品h版在线观看| 精品国产一区二区三区久久狼黑人| 欧美在线播放视频| 亚洲嫩模很污视频| 国产一区二区三区视频免费| 在线看片第一页欧美| 日本中文字幕不卡免费| 久久青草福利网站| 国产精品丝袜久久久久久高清| 久久久久久高潮国产精品视| 欧美日韩国产综合视频在线观看中文| 午夜精品久久久久久久久久久久| 国产精品偷伦视频免费观看国产| 奇米一区二区三区四区久久| 国产精品678| www.午夜精品| 亚洲最大成人网色| 国产精品视频男人的天堂| 成人亚洲综合色就1024| 姬川优奈aav一区二区| 亚州精品天堂中文字幕| 日韩欧美在线视频日韩欧美在线视频| 国产亚洲精品久久久久动| 久久久亚洲天堂| 国产亚洲a∨片在线观看| 欧美电影在线观看| 中文字幕精品一区二区精品| 亚洲精品综合精品自拍| 欧洲精品在线视频| 久久影视电视剧免费网站| 亚洲国产精品久久久久秋霞不卡| 亚洲免费av电影| 亚洲国产免费av| 国产精品日韩久久久久| 日韩国产精品一区| 中文字幕欧美精品在线| 日韩免费观看av| 日本欧美精品在线| 97热精品视频官网| 91精品视频在线看| 亚洲精品久久久久中文字幕二区| 国产成人精品亚洲精品| 亚洲人精品午夜在线观看| 亚洲精品美女视频| 91久久精品国产| 亚洲国产美女久久久久| 欧美成人免费全部观看天天性色| 少妇高潮 亚洲精品| 国产精品91久久久| 亚洲激情免费观看| 91福利视频在线观看| 国产香蕉精品视频一区二区三区| 久久中文字幕在线视频| 精品国产户外野外| 久久精品99无色码中文字幕| 久久精品福利视频| 岛国av在线不卡| 1769国内精品视频在线播放| 在线免费看av不卡| 中文字幕少妇一区二区三区| 狠狠色狠狠色综合日日小说| 欧美成人精品h版在线观看| 91欧美视频网站| 91在线高清视频| 亚洲第一网站免费视频| 国产精品欧美日韩久久| 91中文精品字幕在线视频| 97香蕉超级碰碰久久免费软件| 欧美电影免费观看大全| 国产一区红桃视频| 中文国产亚洲喷潮| 中文字幕免费国产精品| 精品高清美女精品国产区| 色七七影院综合| 亚洲成年网站在线观看| 欧美在线观看一区二区三区| 国产精品视频永久免费播放| 姬川优奈aav一区二区| 狠狠色香婷婷久久亚洲精品| 久久久久国色av免费观看性色| 久久综合伊人77777| 欧美在线观看一区二区三区| 亚洲成人网av| 亚洲成色777777在线观看影院| 国产精品久在线观看| 亚洲欧洲免费视频| 中国日韩欧美久久久久久久久| 国内免费精品永久在线视频| 国产精品嫩草影院久久久| 欧美壮男野外gaytube| 亚洲性日韩精品一区二区| 日韩精品在线免费观看| 91精品久久久久久久久| 国产精品夜色7777狼人| 精品久久中文字幕| 成人福利在线视频| 亚洲一区二区免费在线| 国产精品日韩在线| 青青久久av北条麻妃海外网| 久久精品小视频| 性色av一区二区三区| 热久久视久久精品18亚洲精品| 国产精品手机播放| 中文字幕欧美精品在线| 国产精国产精品| 亚洲午夜久久久影院| 亚洲精品一区二三区不卡| 精品一区电影国产| 精品国产一区二区三区久久久| 亚洲jizzjizz日本少妇| 91成人福利在线| 亚洲电影免费观看| 狠狠久久亚洲欧美专区| 亚洲美女av黄| 久久综合久久美利坚合众国| 国产精品视频资源| 亚洲欧美激情精品一区二区| 最近2019年好看中文字幕视频| 这里只有精品在线播放| 亚洲成人网在线观看| 亚洲精品国产精品久久清纯直播| 精品福利在线视频| 欧美成年人视频网站| 日韩av网址在线观看| 91伊人影院在线播放| 国产精品pans私拍| 久久精品青青大伊人av| 亚洲精品91美女久久久久久久| 国产成人精品免费久久久久| 中文字幕欧美国内| 精品国产成人在线| 日韩精品在线观看视频| 国产成人精品久久二区二区91| 亚洲综合自拍一区| 日韩免费在线观看视频| 欧美最近摘花xxxx摘花| 亚洲精品99久久久久| 尤物99国产成人精品视频| 欧美电影在线观看| 精品在线小视频| 欧美激情在线狂野欧美精品|