Swoole—WebSocket—Task任务使用
Posted willem_chen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swoole—WebSocket—Task任务使用相关的知识,希望对你有一定的参考价值。
Swoole Task任务使用
使用场景:
执行耗时操作(发送邮件 广播等)
如何使用
onTask
onFinish
设置task_worker_num
应用
Ws.php
<?php
/*ws 优化 基础类库*/
class Ws{
CONST HOST = "0.0.0.0";
CONST PORT = 8812;
public $ws = null;
public function __construct(){
$this->ws = new Swoole\\WebSocket\\Server("0.0.0.0",8812);
$this->ws->set(
[
# 设置启动的 Worker 进程数。【默认值:CPU 核数】
'worker_num'=>2,
# 配置 Task 进程的数量
'task_worker_num'=>2,
]
);
$this->ws->on("open",[$this,"onOpen"]);
$this->ws->on("message",[$this,"onMessage"]);
/*
调用 $serv->task() 后,程序立即返回,继续向下执行代码。onTask 回调函数 Task 进程池内被异步执行。执行完成后调用 $serv->finish() 返回结果。
task()投递一个异步任务到 task_worker 池中。此函数是非阻塞的,执行完毕会立即返回。Worker 进程可以继续处理新的请求。使用 Task 功能,必须先设置 task_worker_num,并且必须设置 Server 的 onTask 和 onFinish 事件回调函数。
onTask 在 task 进程内被调用。worker 进程可以使用 task 函数向 task_worker 进程投递新的任务。当前的 Task 进程在调用 onTask 回调函数时会将进程状态切换为忙碌,这时将不再接收新的 Task,当 onTask 函数返回时会将进程状态切换为空闲然后继续接收新的 Task。
*/
$this->ws->on("task",[$this,"onTask"]);
$this->ws->on("finish",[$this,"onFinish"]);
$this->ws->on("close",[$this,"onClose"]);
$this->ws->start();
}
# 监听ws连接事件
public function onOpen($ws,$request){
var_dump($request->fd);
}
# 监听ws消息事件
public function onMessage($ws,$frame){
echo "接收到的信息:{$frame->data}\\n";
// todo 10s
$data = [
'task'=>1,
'fd'=>$frame->fd,
];
$ws->task($data);
$ws->push($frame->fd,"收到了:".date("Y-m-d H:i:s"));
}
public function onTask($serv,$taskId,$workerId,$data){
print_r($data);
//耗时场景
sleep(30);
return "on task finish 执行完了_".$workerId;//告诉work
}
public function onFinish($serv,$taskId,$data){
echo "taskId:{$taskId}\\n";
echo "finish-data-sucess:{$data}\\n";
}
# close
public function onClose($ws,$fd){
echo "client:{$fd}\\n";
}
}
$obj=new Ws();
运行服务
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>client</title>
</head>
<h1>willem-swoole-ws测试</h1>
<script>
var wsUrl = "ws://test.cc:8812";
var websocket=new WebSocket(wsUrl);
//实例对象的onopen属性
websocket.onopen=function(evt){
websocket.send("发送 hello-willem");
console.log("conected-swoole-success");
}
//实例化 onmessage
websocket.onmessage=function(evt){
alert(evt.data+":接收到后端发来的信息弹窗");
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>
预览
30秒后
以上是关于Swoole—WebSocket—Task任务使用的主要内容,如果未能解决你的问题,请参考以下文章