欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

小編給大家分享一下如何使用Think-Swoole的Task異步任務(wù),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

為企業(yè)提供網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)站優(yōu)化、營(yíng)銷(xiāo)型網(wǎng)站、競(jìng)價(jià)托管、品牌運(yùn)營(yíng)等營(yíng)銷(xiāo)獲客服務(wù)。創(chuàng)新互聯(lián)建站擁有網(wǎng)絡(luò)營(yíng)銷(xiāo)運(yùn)營(yíng)團(tuán)隊(duì),以豐富的互聯(lián)網(wǎng)營(yíng)銷(xiāo)經(jīng)驗(yàn)助力企業(yè)精準(zhǔn)獲客,真正落地解決中小企業(yè)營(yíng)銷(xiāo)獲客難題,做到“讓獲客更簡(jiǎn)單”。自創(chuàng)立至今,成功用技術(shù)實(shí)力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營(yíng)銷(xiāo)”三大難題,同時(shí)降低了營(yíng)銷(xiāo)成本,提高了有效客戶轉(zhuǎn)化率,獲得了眾多企業(yè)客戶的高度認(rèn)可!

使用場(chǎng)景

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

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

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

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

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

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

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

定義事件監(jiān)聽(tīng)類(lèi)(php think make:listener 類(lèi)名)。

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

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

在剛剛定義的事件監(jiān)聽(tīng)類(lèi)的 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' => [
        app\listener\EmailTask::class,
    ],
//  'swoole.finish' => [
//      app\listener\EmailTaskFinish::class,
//  ],
],

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

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

app/listener/EmailTask.php

<?php
declare (strict_types = 1);
namespace app\listener;
class EmailTask
{
    /**
     * 事件監(jiān)聽(tīng)處理
     *
     * @return mixed
     */
    public function handle($event)
{
        echo "開(kāi)始發(fā)送郵件:".time();
        //模擬耗時(shí) 3 秒,測(cè)試是否在響應(yīng)事件內(nèi)
        sleep(3);
        echo "郵件發(fā)送成功:".time();
        // 可以調(diào)用 finish 方法通知其他事件類(lèi),通知當(dāng)前異步任務(wù)已經(jīng)完成了(非必須調(diào)用)
        // 參數(shù) $event 是 Swoole\Server\Task 類(lèi)的一個(gè)對(duì)象 可以調(diào)用 finish 方法觸發(fā) task 任務(wù)的 onFinish 事件
        // $event -> finish(\app\listener\EmailTaskFinish::class);
    }
}

注冊(cè)方法 app/controller/Register.php

<?php
namespace app\controller;
use app\BaseController;
class Register extends BaseController
{
    public function register(\Swoole\Server $server)
{
        if($this -> request -> isPost()){
            $data = $this -> request -> post();
            //TODO 調(diào)用驗(yàn)證類(lèi)驗(yàn)證數(shù)據(jù)
            //TODO 將注冊(cè)信息插入數(shù)據(jù)庫(kù)
            // 這里調(diào)用 Task 異步任務(wù)
            $server -> task(\app\listener\EmailTask::class);
            // 方式二
//            $manager = app('\think\swoole\Manager');
//            $manager -> getServer() -> task(\app\listener\EmailTask::class);
            return "注冊(cè)成功!".time();
        }
    }
}

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

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

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

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

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

以上是“如何使用Think-Swoole的Task異步任務(wù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站欄目:如何使用Think-Swoole的Task異步任務(wù)
網(wǎng)頁(yè)鏈接:http://www.chinadenli.net/article24/gcijje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化企業(yè)建站網(wǎng)站策劃App設(shè)計(jì)域名注冊(cè)關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)