2024-07-04 fastadmin thinkphp5.0 queue 訂單倒計時

一 、使用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

進程守護的話寶塔搜索就行

?著作權(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)容

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