首頁 >php框架 >Swoole >swoole怎麼異步調用

swoole怎麼異步調用

藏色散人
藏色散人原創
2020-04-09 10:12:252914瀏覽

swoole怎麼異步調用

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>

 

瀏覽器:(客戶端)

swoole怎麼異步調用

伺服器:

 

swoole怎麼異步調用

第一行資料為服務端輸出,一開始建立連線的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 = [
        &#39;task&#39; => 1,
        &#39;fd&#39; => $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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn