• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

    Think-Swoole之Task 異步任務(wù)

    來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-02 17:29:20
    文檔

    Think-Swoole之Task 異步任務(wù)

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

    使用場景

    在 Server 程序中如果需要執(zhí)行很耗時(shí)的操作,比如一個(gè)聊天服務(wù)器發(fā)送廣播,Web服務(wù)器中發(fā)送郵件。如果直接去執(zhí)行這些函數(shù)就會(huì)阻塞當(dāng)前進(jìn)程,導(dǎo)致服務(wù)器響應(yīng)變慢。例如:用戶注冊場景,完成注冊并發(fā)送激活郵件的功能,需要以下幾步:

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

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

    現(xiàn)在使用 Task 異步任務(wù)投遞可以大大提升用戶體驗(yàn),大致流程:

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

    在注冊成功同時(shí)投遞一個(gè) Task 任務(wù) -> 異步完成郵件發(fā)送的耗時(shí)操作 (這部分時(shí)間用戶是無感知的,因?yàn)楹茉缫呀?jīng)響應(yīng)回客戶端了)。

    如何使用 Think-Swoole 的 Task 異步任務(wù)的步驟

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

    app/event.php 文件中定義 swoole.task 的事件監(jiān)聽。

    獲取到 Swoole/Server 對象調(diào)用 task 方法(參數(shù)中傳遞剛剛定義的監(jiān)聽類)。

    在剛剛定義的事件監(jiān)聽類的 handle 方法中定義觸發(fā)回調(diào)邏輯代碼。

    調(diào)用觸發(fā) task swoole.finish任務(wù)完成后的 finish 方法(需要才調(diào)用,非必須)。

    進(jìn)行演示

    首先,項(xiàng)目根目錄創(chuàng)建郵件發(fā)送事件:

    php think make:listener EmailTask

    然后定義創(chuàng)建的郵件發(fā)送事件:

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

    其中 swoole.task 這個(gè)鍵名是 Task 任務(wù)固定寫法不能隨意命名。

    接著,我們在負(fù)責(zé)用戶注冊的控制器內(nèi),通過 Swoole/Server 類來調(diào)用 Task 異步任務(wù),當(dāng)然,我們要先完善 EmailTask.php 的邏輯代碼:

    app/listener/EmailTask.php

    <?php
    declare (strict_types = 1);
    namespace applistener;
    class EmailTask
    {
     /**
     * 事件監(jiān)聽處理
     *
     * @return mixed
     */
     public function handle($event)
    {
     echo "開始發(fā)送郵件:".time();
     //模擬耗時(shí) 3 秒,測試是否在響應(yīng)事件內(nèi)
     sleep(3);
     echo "郵件發(fā)送成功:".time();
     // 可以調(diào)用 finish 方法通知其他事件類,通知當(dāng)前異步任務(wù)已經(jīng)完成了(非必須調(diào)用)
     // 參數(shù) $event 是 SwooleServerTask 類的一個(gè)對象 可以調(diào)用 finish 方法觸發(fā) task 任務(wù)的 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 調(diào)用驗(yàn)證類驗(yàn)證數(shù)據(jù)
     //TODO 將注冊信息插入數(shù)據(jù)庫
     // 這里調(diào)用 Task 異步任務(wù)
     $server -> task(applistenerEmailTask::class);
     // 方式二
    // $manager = app('	hinkswooleManager');
    // $manager -> getServer() -> task(applistenerEmailTask::class);
     return "注冊成功!".time();
     }
     }
    }

    注冊業(yè)務(wù)中,插入數(shù)據(jù)庫后,調(diào)用了發(fā)送郵件異步任務(wù),在 EmailTask.php 模擬發(fā)送郵件需要 3 秒鐘。

    開啟 Think-Swoole 服務(wù),訪問注冊的方法,測試一下發(fā)送郵件的時(shí)間是否計(jì)入用戶注冊方法內(nèi):

    0b56ff1aa87aeeb13a04a280c258546.png

    可見,郵件發(fā)送的 3 秒鐘是異步進(jìn)行的,用戶并無感知。

    另外,還有個(gè) swoole.finish 事件,用來通知其他事件當(dāng)前異步任務(wù)已經(jīng)完成了,同樣需要?jiǎng)?chuàng)建事件,在 app/event.php 中定義 swoole.finish,上述示例代碼已經(jīng)演示了。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Think-Swoole之Task 異步任務(wù)

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 麻豆aⅴ精品无码一区二区| 99久久99这里只有免费的精品| 亚洲精品无码久久久久sm| 亚洲一二成人精品区| 精品人妻无码一区二区色欲产成人| 国产午夜亚洲精品国产成人小说| 国产精品久久影院| 久久亚洲国产成人精品性色| 亚洲AV蜜桃永久无码精品| 777欧美午夜精品影院| 福利姬在线精品观看| 亚洲日韩精品A∨片无码| 久久精品亚洲男人的天堂| 97精品在线播放| 老司机99精品99| 99久久免费国产精精品| 久久精品中文闷骚内射| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 无码国内精品人妻少妇| 欧美日韩国产成人高清视频,欧美日韩在线精品一 | 亚洲精品狼友在线播放| 午夜亚洲av永久无码精品| 精品无码人妻一区二区三区不卡| 国产激情精品一区二区三区| 四虎影视国产精品亚洲精品hd| 久久精品这里热有精品| 久久国产精品一区二区| 四虎国产精品永久地址99| 51精品资源视频在线播放| 亚洲综合精品一二三区在线 | 国产精品一区二区av| 精品久久久久香蕉网| 全球AV集中精品导航福利| 日韩精品无码久久久久久 | 亚洲精品人成在线观看| 国产成人精品久久| 国产精品永久久久久久久久久| 国内精品久久久久久久久| 精品人体无码一区二区三区| 麻豆精品视频在线观看91| 亚洲国产成人精品女人久久久 |