ThinkPHP 實現(xiàn)隊列

think_queue下載

think_queue應(yīng)用文檔

tp5.1_隊列queue學(xué)習(xí)

/*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ù)庫中體會隊列原理。
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 955評論 0 3
  • 在iOS開發(fā)中,并行一直被認為是項目里的怪物。它被認為是一個危險的區(qū)域,許多開發(fā)者盡力去避免的區(qū)域。有謠傳說多線程...
    小熱狗閱讀 1,057評論 0 4
  • 本文用來介紹 iOS 多線程中 GCD 的相關(guān)知識以及使用方法。這大概是史上最詳細、清晰的關(guān)于 GCD 的詳細講...
    花花世界的孤獨行者閱讀 578評論 0 1
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,674評論 1 32
  • 1.NSTimer不準(zhǔn)時的原因:(1).RunLoop循環(huán)處理時間,每次循環(huán)是固定時間,只有在這段時間才會去查看N...
    稻春閱讀 1,368評論 0 3

友情鏈接更多精彩內(nèi)容