一 、使用composer下載queue
thinkphp5.0的話使用這個
composer require topthink/think-queue=1.1.6
更高版本使用這個
composer require topthink/think-queue
二、創(chuàng)建者控制器
1、創(chuàng)建一個Job控制器,引入queue類
2、1 * 10 是等待時長,單位是秒
3、@前面是取消訂單控制器的地址,要帶著controller,后面是控制器里面的方法,默認為fire
<?php
namespace app\admin\controller;
use app\common\controller\Backend;
use think\Queue;
/**
* 后臺首頁
* @internal
*/
class Job extends Backend
{
protected $noNeedLogin = ['login'];
protected $noNeedRight = ['index', 'logout'];
protected $layout = '';
public function _initialize()
{
parent::_initialize();
//移除HTML標簽
$this->request->filter('trim,strip_tags,htmlspecialchars');
}
public function createOrder()
{
// 創(chuàng)建訂單業(yè)務(wù)代碼
Queue::later(1 * 10, 'app\admin\controller\Hello@closeOrder', 3); //加入隊列,并延遲關(guān)閉時間執(zhí)行
}
}
三、消費者控制器
1、引入job類
2、寫自己邏輯的方法就行,注釋都有
<?php
/**
* 文件路徑: \application\index\job\Hello.php
* 這是一個消費者類,用于處理 helloJobQueue 隊列中的任務(wù)
*/
namespace app\admin\controller;
use think\queue\Job;
class Hello {
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['index', 'logout'];
protected $layout = '';
/**
* fire方法是消息隊列默認調(diào)用的方法
* @param Job $job 當(dāng)前的任務(wù)對象
* @param array|mixed $data 發(fā)布任務(wù)時自定義的數(shù)據(jù)
*/
public function fire(Job $job,$data){
// 如有必要,可以根據(jù)業(yè)務(wù)需求和數(shù)據(jù)庫中的最新數(shù)據(jù),判斷該任務(wù)是否仍有必要執(zhí)行.
$isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
if(!$isJobStillNeedToBeDone){
$job->delete();
return;
}
$isJobDone = $this->doHelloJob($data);
if ($isJobDone) {
//如果任務(wù)執(zhí)行成功, 記得刪除任務(wù)
$job->delete();
print("<info>22222222"."</info>\n");
}else{
if ($job->attempts() > 3) {
//通過這個方法可以檢查這個任務(wù)已經(jīng)重試了幾次了
print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
$job->delete();
// 也可以重新發(fā)布這個任務(wù)
//print("<info>Hello Job will be availabe again after 2s."."</info>\n");
//$job->release(2); //$delay為延遲時間,表示該任務(wù)延遲2秒后再執(zhí)行
}
}
}
/**
* 有些消息在到達消費者時,可能已經(jīng)不再需要執(zhí)行了
* @param array|mixed $data 發(fā)布任務(wù)時自定義的數(shù)據(jù)
* @return boolean 任務(wù)執(zhí)行的結(jié)果
*/
private function checkDatabaseToSeeIfJobNeedToBeDone($data){
return true;
}
public function closeOrder(Job $job, $data)
{
print("<info>11111111111".$data."</info>\n");
$job->delete();
}
/**
* 根據(jù)消息中的數(shù)據(jù)進行實際的業(yè)務(wù)處理
* @param array|mixed $data 發(fā)布任務(wù)時自定義的數(shù)據(jù)
* @return boolean 任務(wù)執(zhí)行的結(jié)果
*/
private function doHelloJob($data) {
// 根據(jù)消息中的數(shù)據(jù)進行實際的業(yè)務(wù)處理...
print("<info>Hello Job Started. job Data is: ".var_export($data,true)."</info> \n");
print("<info>Hello Job is Fired at " . date('Y-m-d H:i:s') ."</info> \n");
print("<info>Hello Job is Done!"."</info> \n");
return true;
}
}
四、監(jiān)聽&進程守護
php think queue:listen
進程守護的話寶塔搜索就行