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 服務,存取註冊的方法,測試一下發送郵件的時間是否計入用戶註冊方法內:
可見,郵件發送的3 秒鐘是異步進行的,使用者並無感知。
另外,還有個swoole.finish 事件,用來通知其他事件當前非同步任務已經完成了,同樣需要建立事件,在app/event.php 中定義swoole.finish,上述範例程式碼已經示範了。
以上是Think-Swoole之Task 非同步任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

TP6Think-SwooleRPC服務的效能最佳化與調試一、引言隨著網際網路的快速發展,分散式運算已成為了現代軟體開發中不可或缺的一部分。在分散式運算中,RPC(RemoteProcedureCall,遠端過程呼叫)是一種常用的通訊機制,透過它可以實現跨網路的方法呼叫。 Think-Swoole作為一個高效能的PHP框架,可以很好地支援RPC服務。但是

TP6(ThinkPHP6)是一款基於PHP的開源框架,具有高可擴展性與分散式部署的特性。本文將介紹如何使用TP6配合Swoole擴展,建構一個具備高可擴展性的RPC服務,並給予具體的程式碼範例。首先,我們需要安裝TP6和Swoole擴充。在命令列中執行以下命令:composerrequiretopthink/thinkpeclinstallswo

TP6Think-SwooleRPC服務的高並發請求處理與調度隨著互聯網技術的不斷發展,網路應用的並發請求處理和調度成為了一個重要的挑戰。在TP6框架中,使用Think-Swoole擴充功能可以實現RPC(RemoteProcedureCall)服務的高並發請求處理與調度。本文將介紹如何在TP6框架中建構一個基於Think-Swoole的RPC服務,並提

TP6Think-SwooleRPC服務的資料加密與身份認證機制隨著互聯網的快速發展,越來越多的應用程式需要進行遠端調用,以實現不同模組之間的資料互動和功能調用。在這樣的背景下,RPC(RemoteProcedureCall)就成了一種重要的溝通方式。 TP6Think-Swoole框架可以實現高效能的RPC服務,本文將介紹如何透過資料加密與身分認證

TP6Think-SwooleRPC服務的安全防護與授權驗證隨著雲端運算和微服務的興起,遠端過程呼叫(RPC)成為了開發者們日常工作中不可或缺的一部分。在開發RPC服務時,安全防護和授權驗證是非常重要的,以確保只有合法的請求可以存取和呼叫服務。本文將介紹如何在TP6Think-Swoole框架中實現RPC服務的安全防護與授權驗證。一、RPC服務的基本概念

TP6Think-Swoole的RPC服務與訊息佇列的整合與應用在現代軟體開發中,RPC服務(RemoteProcedureCall)和訊息佇列是常見的技術手段,用於實現分散式系統中的服務呼叫與非同步訊息處理。在TP6框架中整合Think-Swoole元件,可輕鬆實現RPC服務和訊息佇列的功能,並且提供了簡潔的程式碼範例,方便開發者理解和應用。一、RPC

TP6Think-SwooleRPC服務的效能測試與效能調優一、引言隨著網際網路的高速發展,分散式系統的應用越來越廣泛。而在分散式系統中,RPC(遠端過程調用)是一種常見的通訊機制,它可以讓不同節點的服務相互調用,實現分散式系統的協同工作。在TP6框架中,Think-Swoole作為一種高效能的Swoole驅動,提供了方便的RPC服務支援。本文主要介紹了T

TP6Think-Swoole建構的RPC服務與微服務架構實務案例引言:隨著網際網路的快速發展以及業務規模的擴大,傳統的單體架構無法滿足大規模業務場景的需求。因此,微服務架構應運而生。在微服務架構中,RPC(RemoteProcedureCall)服務是實現服務間通訊的一種重要方式。透過RPC服務,各個微服務之間可以方便、有效率地互相呼叫。在本篇文章中
