swoole的task模塊你知道可以應用在哪些地方?

使用場景

Swoole的task模塊可以用來做一些異步的慢速任務、耗時場景。如webim中發廣播,發送郵件等,把這些任務丟給task進程之後,worker進程可以繼續處理新的數據請求,任務完成後會異步通知worker進程告訴它此任務已經完成。此外利用task還可以實現PHP的數據庫連接池,異步隊列等。

使用須知

必須設置Task進程數:task_worker_num

投遞一個異步任務到task_worker池中:Server->task

必須註冊onTask、onFinish2個事件回調函數。

示例

以創建一個WebSocket服務異步投遞任務為例:

ws_server.php:

class Ws {
public $ws = null;
public function __construct() {
$this->ws = new swoole_websocket_server("0.0.0.0", 9501);
$this->ws->set([
'worker_num' => 2, //worker進程數
'task_worker_num' => 2, //task進程數
]);

$this->ws->on("open", [$this, 'onOpen']);
$this->ws->on("message", [$this, 'onMessage']);
$this->ws->on("task", [$this, 'onTask']);
$this->ws->on("finish", [$this, 'onFinish']);
$this->ws->on("close", [$this, 'onClose']);
$this->ws->start();
}
//建立連接回調
public function onOpen($ws, $request) {
echo "{$request->fd}建立了連接";
}
//接受消息回調
public function onMessage($ws, $frame) {
//worker進程異步投遞任務到task_worker進程中
$data = [
'fd' => $frame->fd,
];
$ws->task($data);
//服務器返回
echo "服務器發送消息:666";
}
//完成異步任務回調
public function onTask($serv, $task_id, $worker_id, $data) {
var_dump($data);
//模擬慢速任務
sleep(5);
//返回字符串給worker進程——>觸發onFinish
return "success";
}
//完成任務投遞迴調
public function onFinish($serv, $task_id, $data) {
//task_worker進程將任務處理結果發送給worker進程
echo "完成任務{$task_id}投遞 處理結果:{$data}";
}
//關閉連接回調
public function onClose($ws, $fd) {
echo "{$fd}關閉了連接";
}
}
$obj = new Ws();

前端頁面js監聽:




<title>WebSocket/<title>




開啟WebSocket服務:

php ws_server.php

前後刷新了兩次頁面,WebSocket服務器監聽結果

swoole的task模塊你知道可以應用在哪些地方?

swoole的task模塊你知道可以應用在哪些地方?

服務器會先返回消息給客戶端,然後再執行投遞任務


分享到:


相關文章: