
- 只工作不玩耍,聰明的小孩會變傻
- 21 文章
- 0 評論
- 2 友鏈
TP6隊(duì)列thinkphp-queue使用
2020-11-21 13:14:30
0
安裝thinkphp-queue
composer install topthink/think-queue
win10安裝redis
redis下載地址:點(diǎn)我去下載
找到相應(yīng)的msi文件下載安裝即可
php安裝redis擴(kuò)展
redis擴(kuò)展下載地址:點(diǎn)我去下載
需要注意選擇相應(yīng)的VC擴(kuò)展包,同時(shí)php.ini開啟redis擴(kuò)展
app\index\controller\Demo.php
<?php namespace app\index\controller; use think\facade\Queue; class Demo{ public function index() { //當(dāng)前任務(wù)將由哪個(gè)類來負(fù)責(zé)處理。 //當(dāng)輪到該任務(wù)時(shí),系統(tǒng)將生成一個(gè)該類的實(shí)例,并默認(rèn)調(diào)用其 fire 方法 $jobHandlerClassName = 'app\task\job\Order'; //當(dāng)前任務(wù)歸屬的隊(duì)列名稱,如果為新隊(duì)列,會自動創(chuàng)建 //php think queue:work --queue orderJobQueue //php think queue:work --queue orderJobQueue --daemon $jobQueueName = "orderJobQueue"; //數(shù)組數(shù)據(jù) $orderData = [ 'id' => uniqid(), 'time' => time(), ]; //將該任務(wù)推送到消息隊(duì)列,等待對應(yīng)的消費(fèi)者去執(zhí)行 //這里只是負(fù)責(zé)將數(shù)據(jù)添加到相應(yīng)的隊(duì)列名稱的隊(duì)列里,消費(fèi)者與生產(chǎn)者并無聯(lián)系 $isPushed = Queue::push($jobHandlerClassName , $orderData, $jobQueueName); if( $isPushed !== false ){ echo date('Y-m-d H:i:s') . " 隊(duì)列添加成功"; }else{ echo '隊(duì)列添加失敗'; } } }
app\task\job\Order.php
<?php namespace app\task\job; use think\queue\Job; use think\facade\Log; /** * @Title: app\task\job$Order * @Package package_name * @Description: todo(測試訂單消費(fèi)者) * @author 蘇曉信 <654108442@qq.com> * @date 2020年11月20日 */ class Order{ /** * @Title: fire * @Description: todo(fire方法是消息隊(duì)列默認(rèn)調(diào)用的方法) * @param Job $job * @param array $data * @author 蘇曉信 <654108442@qq.com> * @date 2020年11月20日 * @throws */ public function fire(Job $job, $data) { //有些消息在到達(dá)消費(fèi)者時(shí),可能已經(jīng)不再需要執(zhí)行了 $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data); if(!$isJobStillNeedToBeDone){ $job->delete(); return; } $isJobDone = $this->orders($data); if ($isJobDone) { //如果任務(wù)執(zhí)行成功,記得刪除任務(wù) $job->delete(); }else{ //通過這個(gè)方法可以檢查這個(gè)任務(wù)已經(jīng)重試了幾次了 if ($job->attempts() > 3){ Log::error('試了3次了'); $job->delete(); //也可以重新發(fā)布這個(gè)任務(wù) //print("<info>Hello Job will be availabe again after 2s."."</info>\n"); //$job->release(2); //$delay為延遲時(shí)間,表示該任務(wù)延遲2秒后再執(zhí)行 } } } /** * @Title: checkDatabaseToSeeIfJobNeedToBeDone * @Description: todo(有些消息在到達(dá)消費(fèi)者時(shí),可能已經(jīng)不再需要執(zhí)行了) * @param array $data * @return boolean * @author 蘇曉信 <654108442@qq.com> * @date 2020年11月20日 * @throws */ private function checkDatabaseToSeeIfJobNeedToBeDone($data){ return true; } /** * @Title: orders * @Description: todo(數(shù)據(jù)處理) * @param array $data * @author 蘇曉信 <654108442@qq.com> * @date 2020年11月20日 * @throws */ public function orders($data) { //對訂單進(jìn)行數(shù)據(jù)庫操作或其他等等 Log::info(date('Y-m-d H:i:s').' - data:'.json_encode($data)); return true; } }
監(jiān)聽任務(wù)并執(zhí)行
php think queue:work --queue orderJobQueue
多任務(wù)
app\index\controller\Demo.php
<?php namespace app\index\controller; use think\Exception; use think\facade\Queue; class Demo{ public function index() { $taskType = $_GET['taskType']; switch ($taskType) { // 域名地址/index/demo/index?taskType=taskA case 'taskA': $jobHandlerClassName = 'app\task\job\Order@taskA'; $jobDataArr = ['a' => '1']; //php think queue:work --queue orderAJobQueue $jobQueueName = "orderAJobQueue"; break; // 域名地址/index/demo/index?taskType=taskB case 'taskB': $jobHandlerClassName = 'app\task\job\Order@taskB'; $jobDataArr = ['b' => '2']; //php think queue:work --queue orderBJobQueue $jobQueueName = "orderBJobQueue"; break; default: break; } $isPushed = Queue::push($jobHandlerClassName, $jobDataArr, $jobQueueName); if ($isPushed !== false) { echo("$taskType 添加至 ".$jobQueueName ."<br>"); }else{ throw new Exception("push a new $taskType of MultiTask Job Failed!"); } } }
app\task\job\Order.php
<?php namespace app\task\job; use think\queue\Job; use think\facade\Log; class Order{ public function taskA(Job $job, $data){ $isJobDone = $this->_doTaskA($data); if ($isJobDone) { $job->delete(); }else{ if ($job->attempts() > 3) { $job->delete(); } } } public function taskB(Job $job, $data){ $isJobDone = $this->_doTaskB($data); if ($isJobDone) { $job->delete(); }else{ if ($job->attempts() > 2) { $job->release(); } } } private function _doTaskA($data) { Log::info(date('Y-m-d H:i:s').' - TaskA - data : '.json_encode($data)); return true; } private function _doTaskB($data) { Log::info(date('Y-m-d H:i:s').' - TaskB - data : '.json_encode($data)); return true; } }
監(jiān)聽任務(wù)并執(zhí)行
php think queue:work --queue orderAJobQueue php think queue:work --queue orderBJobQueue
上一篇:X
年歲有加,并非垂老,理想丟棄,方墜暮年。
網(wǎng)站標(biāo)簽
熱門文章
最新文章
最新評論
蘇先生:
只工作不玩耍,聰明的小孩會變傻【暫時(shí)還不能評論,我就只是給你看著玩的!】