Think-Swoole之Task 非同步任務

發布: 2020-10-27 13:39:09
轉載
3809 人瀏覽過

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

 finish(\app\listener\EmailTaskFinish::class); } }
登入後複製

註冊方法app/controller/Register.php

 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 非同步任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:阿dai哥
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!