视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
swoole怎么异步调用
2020-11-03 13:39:01 责编:小采
文档


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}
";
 $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}
";
 echo "finish-data-sucess:{$data}
";
}

客户端,即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}
";
 $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的影响。

下载本文
显示全文
专题