91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-03-06 10:33:15 來源:億速云 閱讀:258 作者:小新 欄目:編程語言

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

使用場景

在 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' => [
        app\listener\EmailTask::class,
    ],
//  'swoole.finish' => [
//      app\listener\EmailTaskFinish::class,
//  ],
],

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

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

app/listener/EmailTask.php

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

注冊方法 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 調用驗證類驗證數據
            //TODO 將注冊信息插入數據庫
            // 這里調用 Task 異步任務
            $server -> task(\app\listener\EmailTask::class);
            // 方式二
//            $manager = app('\think\swoole\Manager');
//            $manager -> getServer() -> task(\app\listener\EmailTask::class);
            return "注冊成功!".time();
        }
    }
}

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

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

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

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

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

以上是“如何使用Think-Swoole的Task異步任務”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德兴市| 仙游县| 正镶白旗| 深泽县| 广丰县| 长葛市| 阿城市| 寿阳县| 若尔盖县| 边坝县| 桂平市| 彭泽县| 新野县| 香河县| 云龙县| 芦山县| 锡林郭勒盟| 江北区| 淮阳县| 乳源| 奈曼旗| 铁力市| 关岭| 本溪| 沧源| 崇州市| 永寿县| 南木林县| 泽普县| 乌兰浩特市| 邯郸县| 女性| 思茅市| 台江县| 界首市| 肇源县| 曲周县| 准格尔旗| 方山县| 茌平县| 阿克|