<noframes id="bhrfl"><address id="bhrfl"></address>

    <address id="bhrfl"></address>

    <noframes id="bhrfl"><address id="bhrfl"><th id="bhrfl"></th></address>

    <form id="bhrfl"><th id="bhrfl"><progress id="bhrfl"></progress></th></form>

    <em id="bhrfl"><span id="bhrfl"></span></em>

    全部
    常見問題
    產品動態
    精選推薦

    如何二開知識付費的消息隊列

    管理 管理 編輯 刪除

    消息隊列的概念、原理和場景

    在高并發的時候,程序往往無法做到及時的處理。我們引入一個中間的系統,來進行分流和減壓。

    所以從本質上講:消息隊列就是一個隊列結構的中間件。也就是說,你把消息和內容放入這個容器之后就可以直接返回,不用等它后期處理的結果。另外會有一個程序,讀取這些數據并按照順序處理。

    1、隊列結構的中間件

    2、消息放入后,不必立即處理

    3、由訂閱者/消費者按順序處理

    也就是說:當遇到一個比較大或者耗時比較長的環節的時候,而同時你的業務又不需要立即知道這個環節的結果,使用消息隊列是好的選擇。  

    知識付費的拼團功能使用的就是消息隊列功能把每個拼團訂單都儲存在消息隊列中,拼團完成或拼團結束就可以自動處理這個訂單。

    application\index\controller\PushJob

        /**
         * 一個使用了隊列的 action
         */
        public static function actionWithDoPinkJob(array $data, string $name = '')
        {
            try {
                // 1.當前任務將由哪個類來負責處理。
                //   當輪到該任務時,系統將生成一個該類的實例,并調用其 fire 方法
                $jobHandlerClassName = 'app\index\job\PullDoPink';
                // 2.當前任務歸屬的隊列名稱,如果為新隊列,會自動創建
                $jobQueueName = Config::get('queue_name', '') ? Config::get('queue_name', '') : 'doPinkJobQueue';
                // 3.當前任務所需的業務數據 . 不能為 resource 類型,其他類型最終將轉化為json形式的字符串
                //   ( jobData 為對象時,存儲其public屬性的鍵值對 )
                if ($name) {
                    $jobData = ['pinkInfo' => $data, 'time' => date('Y-m-d H:i:s'), 'doName' => $name];
                    $isPushed = Queue::push($jobHandlerClassName, $jobData, $jobQueueName);
                } else {
                    $jobData = ['pinkInfo' => $data, 'time' => date('Y-m-d H:i:s')];
                    if (!isset($data['pink_time']) || !$data['pink_time']) return true;
                    $timewait = $data['pink_time'] + 300;
                    //$jobData   = [ 'pinkInfo' => 'hahah', 'time' => date('Y-m-d H:i:s'), 'b' => 21] ;
                    //$timewait = 20;
                    // 4.將該任務推送到消息隊列,等待對應的消費者去執行
                    $isPushed = Queue::later($timewait, $jobHandlerClassName, $jobData, $jobQueueName);
                    //$isPushed = Queue::push($jobHandlerClassName , $jobData , $jobQueueName );
                    // database 驅動時,返回值為 1|false  ;   redis 驅動時,返回值為 隨機字符串|false
                }
                if ($isPushed !== false) {
                    return 1;
                } else {
                    return 1;
                }
            } catch (ErrorException $e) {
                echo $e->getMessage();
            }
    
        }

    application\index\job\PullDoPink

    /**
         * fire方法是消息隊列默認調用的方法
         * @param Job $job 當前的任務對象
         * @param array|mixed $data 發布任務時自定義的數據
         */
        public function fire(Job $job, $data)
        {
            // 有些消息在到達消費者時,可能已經不再需要執行了
            $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
            if (!$isJobStillNeedToBeDone) {
                $job->delete();
                return;
            }
            if (isset($data['doName']) && $data['doName']) {
                $doName = $data['doName'];
                $isJobDone = $this->$doName($data);
            } else
                $isJobDone = $this->doPinkJob($data);
    
    
            if ($isJobDone) {
                // 如果任務執行成功, 記得刪除任務
                $job->delete();
                //print("<info>Hello Job has been done and deleted"."</info>\n");
            } else {
                if ($job->attempts() > 3) {
                    //通過這個方法可以檢查這個任務已經重試了幾次了
                    // print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
                    $job->delete();
                    // 也可以重新發布這個任務
                    //print("<info>Hello Job will be availabe again after 2s."."</info>\n");
                    //$job->release(2); //$delay為延遲時間,表示該任務延遲2秒后再執行
                }
            }
        }


       /**
         * 有些消息在到達消費者時,可能已經不再需要執行了
         * @param array|mixed $data 發布任務時自定義的數據
         * @return boolean                 任務執行的結果
         */
        private function checkDatabaseToSeeIfJobNeedToBeDone($data)
        {
            return true;
        }


    拼團使用,在訂單生成完成后,把參數加入$do_job_pink數組中

    PushJob::actionWithDoPinkJob($do_job_pink);

    在application\index\job\PullDoPink下加如下面的方法用來接受處理數據


        /**
         * 根據消息中的數據進行實際的業務處理...
         */
        private function doPinkJob($data)
        {
            $pink_id = $data['pinkInfo']['pink_id'];
            if ($pink_id) {
                $pink_info = \app\wap\model\store\StorePink::where(['id' => $pink_id, 'k_id' => 0, 'status' => 1])->find();
                if ($pink_info ? $pink_info = $pink_info->toArray() : []) {
                    list($pinkAll, $pinkT, $count, $idAll) = \app\wap\model\store\StorePink::getPinkMemberAndPinkK($pink_info);
                    \app\wap\model\store\StorePink::PinkFail($pink_info['uid'], $idAll, $pinkAll, $pinkT, $count, 1, [], true, true);
                }
            }
            return true;
        }

    如果需要加新的消息隊列可以設置不同的名稱即可

    PushJob::actionWithDoPinkJob($do_job_pink,’名稱’);

    application\index\job\PullDoPink:

    private function 名稱($data)
    {
       
    return true;
    }

    完成后重新啟動消息隊列

    請登錄后查看

    全 最后編輯于2025-03-24 11:39:50

    快捷回復
    回復
    回復
    回復({{post_count}}) {{!is_user ? '我的回復' :'全部回復'}}
    排序 默認正序 回復倒序 點贊倒序

    {{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level }}

    作者 管理員 企業

    {{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
    {{item.is_suggest == 1? '取消推薦': '推薦'}}
    沙發 板凳 地板 {{item.floor}}#
    {{item.user_info.title || '暫無簡介'}}
    附件

    {{itemf.name}}

    {{item.created_at}}  {{item.ip_address}}
    打賞
    已打賞¥{{item.reward_price}}
    {{item.like_count}}
    {{item.showReply ? '取消回復' : '回復'}}
    刪除
    回復
    回復

    {{itemc.user_info.nickname}}

    {{itemc.user_name}}

    回復 {{itemc.comment_user_info.nickname}}

    附件

    {{itemf.name}}

    {{itemc.created_at}}
    打賞
    已打賞¥{{itemc.reward_price}}
    {{itemc.like_count}}
    {{itemc.showReply ? '取消回復' : '回復'}}
    刪除
    回復
    回復
    查看更多
    打賞
    已打賞¥{{reward_price}}
    673
    {{like_count}}
    {{collect_count}}
    添加回復 ({{post_count}})

    相關推薦

    快速安全登錄

    使用微信掃碼登錄
    {{item.label}} 加精
    {{item.label}} {{item.label}} 板塊推薦 常見問題 產品動態 精選推薦 首頁頭條 首頁動態 首頁推薦
    取 消 確 定
    回復
    回復
    問題:
    問題自動獲取的帖子內容,不準確時需要手動修改. [獲取答案]
    答案:
    提交
    bug 需求 取 消 確 定
    打賞金額
    當前余額:¥{{rewardUserInfo.reward_price}}
    {{item.price}}元
    請輸入 0.1-{{reward_max_price}} 范圍內的數值
    打賞成功
    ¥{{price}}
    完成 確認打賞

    微信登錄/注冊

    切換手機號登錄

    {{ bind_phone ? '綁定手機' : '手機登錄'}}

    {{codeText}}
    切換微信登錄/注冊
    暫不綁定
    亚洲欧美字幕
    CRMEB客服

    CRMEB咨詢熱線 咨詢熱線

    400-8888-794

    微信掃碼咨詢

    CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
    返回頂部 返回頂部
    CRMEB客服