<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                #### 安裝think-queue - 官方地址:https://github.com/top-think/think-queue - `composer require topthink/think-queue` #### 寫業務控制器 ```php <?php namespace app\api\controller; use app\admin\model\general\Basic; use app\admin\model\order\OrderItem; use app\admin\model\user\Withdrawal; use app\common\model\ScoreLog; use think\Db; use think\Exception; use think\Queue\Job; class DoJob { /** * fire方法是消息隊列默認調用的方法 * @param Job $job 當前的任務對象 * @param $data 發布任務時自定義的數據 * @return int */ public function fire(Job $job, $data) { if (empty($data)) { return 0; } $isJobDone = false; // 業務部分START // 有些消息在到達消費者時,可能已經不再需要執行了 $isJobDone = true; // 業務部分END /*根據次數處理刪除邏輯START*/ // $nums = $job->attempts(); // if ($nums > 0) { // $job->delete(); // } // $job->delete(); /*根據次數處理刪除邏輯END*/ if ($isJobDone) { // 如果任務執行成功,刪除任務 $job->delete(); } else { if ($job->attempts() > 3) { //通過這個方法可以檢查這個任務已經重試了幾次了 $job->delete(); // 也可以重新發布這個任務 //$job->release(2); //$delay為延遲時間,表示該任務延遲2秒后再執行 } } } } ``` #### 調用消息隊列 ```php $jobHandlerClassName = 'app\api\controller\DoJob'; //根據Dojob命名空間位置來編寫,Dojob如上面的控制器所示 $data = ['user_id' => 3]; $ret = Queue::later(10, $jobHandlerClassName, $data, $queue = 'OrderTimeOut'); //延時執行 $ret = Queue::push($jobHandlerClassName, $data, $queue = 'OrderTimeOut');//立即執行 ``` ###### 相關說明 - Queue::later //延時執行 - Queue::push//立即執行 - $queue 隊列名稱,可以為null ,當有名稱的時候,監聽腳本: `php think queue:listen --queue OrderTimeOut` #### 準備工作 - 安裝Redis,對應版本PHP安裝redis擴展 - 安裝supervisor用于監聽事件,如下圖所示 ![在這里插入圖片描述](https://img-blog.csdnimg.cn/20210518135126738.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MDUwMzYw,size_16,color_FFFFFF,t_70#pic_center) #### 修改queue配置: - application\extra\queue.php ```php <?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: yunwuxin <448901948@qq.com> // +---------------------------------------------------------------------- return [ 'connector' => 'redis', // 隊列驅動使用 redis 推薦, 可選 database 不推薦 'host' => '127.0.0.1', // redis 主機地址 'password' => '', // redis 密碼 'port' => 6379, // redis 端口 'select' => 1, // redis db 庫, 建議顯示指定 1-15 的數字均可,如果緩存驅動是 redis,避免和緩存驅動 select 沖突 'timeout' => 0, // redis 超時時間 'persistent' => false, // redis 持續性,連接復用 ]; ``` #### 官方markdown存檔: ## 安裝 > composer require topthink/think-queue ## 配置 > 配置文件位于 `config/queue.php` ### 公共配置 ``` [ 'default'=>'sync' //驅動類型,可選擇 sync(默認):同步執行,database:數據庫驅動,redis:Redis驅動//或其他自定義的完整的類名 ] ``` ## 創建任務類 > 單模塊項目推薦使用 `app\job` 作為任務類的命名空間 > 多模塊項目可用使用 `app\module\job` 作為任務類的命名空間 > 也可以放在任意可以自動加載到的地方 任務類不需繼承任何類,如果這個類只有一個任務,那么就只需要提供一個`fire`方法就可以了,如果有多個小任務,就寫多個方法,下面發布任務的時候會有區別 每個方法會傳入兩個參數 `think\queue\Job $job`(當前的任務對象) 和 `$data`(發布任務時自定義的數據) 還有個可選的任務失敗執行的方法 `failed` 傳入的參數為`$data`(發布任務時自定義的數據) ### 下面寫兩個例子 ``` namespace app\job; use think\queue\Job; class Job1{ public function fire(Job $job, $data){ //....這里執行具體的任務 if ($job->attempts() > 3) { //通過這個方法可以檢查這個任務已經重試了幾次了 } //如果任務執行成功后 記得刪除任務,不然這個任務會重復執行,直到達到最大重試次數后失敗后,執行failed方法 $job->delete(); // 也可以重新發布這個任務 $job->release($delay); //$delay為延遲時間 } public function failed($data){ // ...任務達到最大重試次數后,失敗了 } } ``` ``` namespace app\lib\job; use think\queue\Job; class Job2{ public function task1(Job $job, $data){ } public function task2(Job $job, $data){ } public function failed($data){ } } ``` ## 發布任務 > `think\facade\Queue::push($job, $data = '', $queue = null)` 和 `think\facade\Queue::later($delay, $job, $data = '', $queue = null)` 兩個方法,前者是立即執行,后者是在`$delay`秒后執行 `$job` 是任務名 單模塊的,且命名空間是`app\job`的,比如上面的例子一,寫`Job1`類名即可 多模塊的,且命名空間是`app\module\job`的,寫`model/Job1`即可 其他的需要些完整的類名,比如上面的例子二,需要寫完整的類名`app\lib\job\Job2` 如果一個任務類里有多個小任務的話,如上面的例子二,需要用@+方法名`app\lib\job\Job2@task1`、`app\lib\job\Job2@task2` `$data` 是你要傳到任務里的參數 `$queue` 隊列名,指定這個任務是在哪個隊列上執行,同下面監控隊列的時候指定的隊列名,可不填 ## 監聽任務并執行 > php think queue:listen > php think queue:work 兩種,具體的可選參數可以輸入命令加 --help 查看 > 可配合supervisor使用,保證進程常駐 #### 參考博客: - 參考一:https://www.cnblogs.com/gyfluck/p/14024580.html - 參考二:https://blog.csdn.net/qq_43489208/article/details/105140261
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看