/*1.先在控制器里添加下面兩個方法*/
namespace app\index\controller;
use think\Controller;
use think\Queue;
use think\Db;
class Index extends Controller
{
public function queueTest(){
$data = [
'order_no' =>rand(100000,999999),
];
$this->add($data['order_no']);
$data = json_encode($data);
$res =Queue::push('Job1', $data, $queue = null);
var_dump($res);
}
public function add($orderNo){
$data =[
'order_no'=>$orderNo,
'msg'=>$orderNo,
'create_time'=>date('Y-m-d H:i:s'),
];
Db::name('tp5_test')->insert($data);
}
}
/*2.在app/job/Job1.php創(chuàng)建文件,并添加如下代碼*/
//Job1 這個在app\job 下新建一個.php 寫一個Job1類
namespace app\job;
use think\queue\Job;
use think\Db;
use think\Controller;
class Job1 extends Controller
{
public function fire(Job $job, $data)
{
//....這里執(zhí)行具體的任務(wù)
$data = json_decode($data,true);
if($this->jobDone($data))
{
$job->delete();
print("<info>Hello Job has been done and deleted"."</info>\n");
}else{
$job->release(3); //$delay為延遲時間
}
if ($job->attempts() > 3) {
//通過這個方法可以檢查這個任務(wù)已經(jīng)重試了幾次了
}
//如果任務(wù)執(zhí)行成功后 記得刪除任務(wù),不然這個任務(wù)會重復(fù)執(zhí)行,直到達到最大重試次數(shù)后失敗后,執(zhí)行failed方法
// $job->delete();
// 也可以重新發(fā)布這個任務(wù)
// $job->release($delay); //$delay為延遲時間
}
public function failed($data)
{
// ...任務(wù)達到最大重試次數(shù)后,失敗了
}
public function jobDone($data)
{
print("<info>Job is Done status!"."</info> \n");
return Db::name('tp5_test')->where('order_no',$data['order_no'])->update(['status'=>2]);
}
}
/*3. 添加兩張表*/
//數(shù)據(jù)測試表
DROP TABLE IF EXISTS `tp5_test`;
CREATE TABLE `tp5_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`order_no` varchar(50) NOT NULL COMMENT '訂單號',
`msg` varchar(255) NOT NULL COMMENT '消息內(nèi)容',
`status` tinyint(1) NOT NULL COMMENT '狀態(tài) 0未執(zhí)行,1 執(zhí)行',
`create_time` datetime NOT NULL COMMENT '創(chuàng)建時間',
`update_time` datetime NOT NULL COMMENT '更新時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='測試表';
//消息隊列表
DROP TABLE IF EXISTS `tp5_jobs`;
CREATE TABLE `tp5_jobs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`queue` varchar(255) NOT NULL,
`payload` longtext NOT NULL,
`attempts` tinyint(3) unsigned NOT NULL,
`reserved` tinyint(3) unsigned NOT NULL,
`reserved_at` int(10) unsigned DEFAULT NULL,
`available_at` int(10) unsigned NOT NULL,
`created_at` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
/*4. 消息的創(chuàng)建與推送*/
//在瀏覽器里打開
http://demain/index/index/queueTest
/* 5.消息的消費與刪除*/
//windows 在 cmd里在網(wǎng)站根目錄運行 linux找到當(dāng)前網(wǎng)站根目錄 當(dāng)然你php命令必須能執(zhí)行。
//執(zhí)行一行
php think queue:work --queue -v
//循環(huán)執(zhí)行
php think queue:work --daemon
//最后自己在數(shù)據(jù)庫中體會隊列原理。
ThinkPHP 實現(xiàn)隊列
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 在iOS開發(fā)中,并行一直被認為是項目里的怪物。它被認為是一個危險的區(qū)域,許多開發(fā)者盡力去避免的區(qū)域。有謠傳說多線程...
- 本文用來介紹 iOS 多線程中 GCD 的相關(guān)知識以及使用方法。這大概是史上最詳細、清晰的關(guān)于 GCD 的詳細講...