swoole怎麼非同步呼叫?
Swoole中的非同步使用
測試案例:
改寫ws_server. php
$this->ws->set( [ 'worker_num' => 2, 'task_worker_num' => 2, ] ); $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']); public function onOpen($ws, $request) { var_dump($request->fd); } public function onMessage($ws, $frame) { echo "ser-push-message:{$frame->data}\n"; $data = [ 'task' => 1, 'fd' => $frame->fd, ]; $ws->task($data); $ws->push($frame->fd, "server-push:".date("Y-m-d H:i:s")); } public function onTask($serv, $taskId, $workerId, $data) { print_r($data); // 耗时场景 10s sleep(10); return "on task finish"; // 告诉worker } public function onFinish($serv, $taskId, $data) { echo "taskId:{$taskId}\n"; echo "finish-data-sucess:{$data}\n"; }
客戶端,即ws_client.html,發送訊息,服務端的onMessage接受並執行設定資料呼叫onTask,在onTask中列印資料3秒後傳回資料給onFinish,onFinish接受資料並輸出。
使用者頁面:
<!DOCTYPE html> <head> <meta charset="UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <h1>chuangxiang--测试</h1> <script> var wsUrl = "ws://192.168.0.103:8812"; var websocket = new WebSocket(wsUrl); //实例对象的onopen属性 websocket.onopen = function(evt) { websocket.send("Hello chaungxiang");//输出到服务器端,即发送信息 console.log("connected-swoole-success");//输出在页面 } //实例化 onmessage websocket.onmessage = function(evt) { console.log("ws-server-return-data:"+evt.data); } //实例化onclose websocket.onclose = function(evt) { console.log("close"); } //实例化onerror websocket.onerror =function(evt,e) { console.log("error:"+evt.data); } </script> </body> </html>
瀏覽器:(客戶端)
伺服器:
第一行資料為服務端輸出,一開始建立連線的onOpen(),之後先由客戶端(ws_client.html)透過js程式碼連線並發送資料;第二行為發送資料前列印;發送資料到服務端後,執行onMessage();其中再次輸出資料並建立task,呼叫onTask();在其中再次輸出資料並傳回資料給onFinish();
伺服器端直接輸出是到伺服器,客戶端需要透過push,send等傳送到伺服器
客戶端透過console.log列印資料到頁面
非同步體現
public function onMessage($ws, $frame) { echo "ser-push-message:{$frame->data}\n"; $data = [ 'task' => 1, 'fd' => $frame->fd, ]; $ws->task($data); $ws->push($frame->fd, "server-push:".date("Y-m-d H:i:s")); }
這段程式碼中建立一個task任務之後,不會等到任務執行完後再push,而是會同時進行。在客戶端列印並傳送資料後,客戶端列印的資料與onMessage中的輸出間隔很短,並不會受ontask任務中sleep的影響。
以上是swoole怎麼異步調用的詳細內容。更多資訊請關注PHP中文網其他相關文章!