<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Think-Swoole之Task 異步任務

        來源:懂視網 責編:小采 時間:2020-11-02 17:29:20
        文檔

        Think-Swoole之Task 異步任務

        Think-Swoole之Task 異步任務:使用場景在 Server 程序中如果需要執行很耗時的操作,比如一個聊天服務器發送廣播,Web服務器中發送郵件。如果直接去執行這些函數就會阻塞當前進程,導致服務器響應變慢。例如:用戶注冊場景,完成注冊并發送激活郵件的功能,需要以下幾步:客戶端提交 PO
        推薦度:
        導讀Think-Swoole之Task 異步任務:使用場景在 Server 程序中如果需要執行很耗時的操作,比如一個聊天服務器發送廣播,Web服務器中發送郵件。如果直接去執行這些函數就會阻塞當前進程,導致服務器響應變慢。例如:用戶注冊場景,完成注冊并發送激活郵件的功能,需要以下幾步:客戶端提交 PO

        使用場景

        在 Server 程序中如果需要執行很耗時的操作,比如一個聊天服務器發送廣播,Web服務器中發送郵件。如果直接去執行這些函數就會阻塞當前進程,導致服務器響應變慢。例如:用戶注冊場景,完成注冊并發送激活郵件的功能,需要以下幾步:

        客戶端提交 POST 數據 -> 服務器獲取到數據 -> 完成注冊將用戶數據寫入數據庫 -> 發送賬號激活郵件 -> 返回客戶端提示注冊成功。

        這個業務邏輯是沒有問題的,但是由于發送郵件是一個耗時操作(比如2-3s)并且會同步阻塞程序的執行,直到發送成功以后響應到客戶端提示注冊成功。這個過程中用戶從提交到最后得到注冊成功的提示估計需要4s左右,一次請求響應需要4s這肯定是不合理的!

        現在使用 Task 異步任務投遞可以大大提升用戶體驗,大致流程:

        客戶端提交 POST 數據 -> 服務器獲取到數據 -> 完成注冊將用戶數據寫入數據庫 -> 馬上返回客戶端提示注冊成功。

        在注冊成功同時投遞一個 Task 任務 -> 異步完成郵件發送的耗時操作 (這部分時間用戶是無感知的,因為很早已經響應回客戶端了)。

        如何使用 Think-Swoole 的 Task 異步任務的步驟

        定義事件監聽類(php think make:listener 類名)。

        app/event.php 文件中定義 swoole.task 的事件監聽。

        獲取到 Swoole/Server 對象調用 task 方法(參數中傳遞剛剛定義的監聽類)。

        在剛剛定義的事件監聽類的 handle 方法中定義觸發回調邏輯代碼。

        調用觸發 task swoole.finish任務完成后的 finish 方法(需要才調用,非必須)。

        進行演示

        首先,項目根目錄創建郵件發送事件:

        php think make:listener EmailTask

        然后定義創建的郵件發送事件:

        app/event.php
        'listen' => [
         'AppInit' => [],
         'HttpRun' => [],
         'HttpEnd' => [],
         'LogLevel' => [],
         'LogWrite' => [],
         'swoole.task' => [
         applistenerEmailTask::class,
         ],
        // 'swoole.finish' => [
        // applistenerEmailTaskFinish::class,
        // ],
        ],

        其中 swoole.task 這個鍵名是 Task 任務固定寫法不能隨意命名。

        接著,我們在負責用戶注冊的控制器內,通過 Swoole/Server 類來調用 Task 異步任務,當然,我們要先完善 EmailTask.php 的邏輯代碼:

        app/listener/EmailTask.php

        <?php
        declare (strict_types = 1);
        namespace applistener;
        class EmailTask
        {
         /**
         * 事件監聽處理
         *
         * @return mixed
         */
         public function handle($event)
        {
         echo "開始發送郵件:".time();
         //模擬耗時 3 秒,測試是否在響應事件內
         sleep(3);
         echo "郵件發送成功:".time();
         // 可以調用 finish 方法通知其他事件類,通知當前異步任務已經完成了(非必須調用)
         // 參數 $event 是 SwooleServerTask 類的一個對象 可以調用 finish 方法觸發 task 任務的 onFinish 事件
         // $event -> finish(applistenerEmailTaskFinish::class);
         }
        }

        注冊方法 app/controller/Register.php

        <?php
        namespace appcontroller;
        use appBaseController;
        class Register extends BaseController
        {
         public function register(SwooleServer $server)
        {
         if($this -> request -> isPost()){
         $data = $this -> request -> post();
         //TODO 調用驗證類驗證數據
         //TODO 將注冊信息插入數據庫
         // 這里調用 Task 異步任務
         $server -> task(applistenerEmailTask::class);
         // 方式二
        // $manager = app('	hinkswooleManager');
        // $manager -> getServer() -> task(applistenerEmailTask::class);
         return "注冊成功!".time();
         }
         }
        }

        注冊業務中,插入數據庫后,調用了發送郵件異步任務,在 EmailTask.php 模擬發送郵件需要 3 秒鐘。

        開啟 Think-Swoole 服務,訪問注冊的方法,測試一下發送郵件的時間是否計入用戶注冊方法內:

        0b56ff1aa87aeeb13a04a280c258546.png

        可見,郵件發送的 3 秒鐘是異步進行的,用戶并無感知。

        另外,還有個 swoole.finish 事件,用來通知其他事件當前異步任務已經完成了,同樣需要創建事件,在 app/event.php 中定義 swoole.finish,上述示例代碼已經演示了。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Think-Swoole之Task 異步任務

        Think-Swoole之Task 異步任務:使用場景在 Server 程序中如果需要執行很耗時的操作,比如一個聊天服務器發送廣播,Web服務器中發送郵件。如果直接去執行這些函數就會阻塞當前進程,導致服務器響應變慢。例如:用戶注冊場景,完成注冊并發送激活郵件的功能,需要以下幾步:客戶端提交 PO
        推薦度:
        標簽: 任務 think 異步
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 本道天堂成在人线av无码免费| 亚洲日本VA午夜在线影院| 国产高清对白在线观看免费91| 免费看的黄色大片| 亚洲AV无码成人精品区日韩| 色吊丝永久在线观看最新免费| 国产精品亚洲精品青青青 | 两个人www免费高清视频| 亚洲天堂免费在线视频| 国产福利免费视频| 亚洲gv猛男gv无码男同短文| 毛片在线播放免费观看| 亚洲av永久无码精品秋霞电影影院 | 亚洲电影在线免费观看| 亚洲一级毛片免费在线观看| 亚洲已满18点击进入在线观看| 日韩伦理片电影在线免费观看| 国产精品成人亚洲| 亚洲动漫精品无码av天堂| 91在线手机精品免费观看| 亚洲中文字幕乱码AV波多JI| 免费国产美女爽到喷出水来视频| 一级一片免费视频播放| 久久国产亚洲观看| 免费a级毛片高清视频不卡 | 免费h黄肉动漫在线观看| 久久WWW免费人成—看片| 日韩亚洲AV无码一区二区不卡| 久久天天躁狠狠躁夜夜免费观看| 日韩色视频一区二区三区亚洲| 久久久久亚洲AV成人网| 真实国产乱子伦精品免费| 国产一区二区三区亚洲综合| 亚洲国产AV无码专区亚洲AV| 最近中文字幕无吗免费高清| 成年网站免费入口在线观看 | 污污网站18禁在线永久免费观看| 亚洲AV成人一区二区三区在线看| 一区二区三区亚洲视频| 免费观看激色视频网站bd| 美女黄频a美女大全免费皮|