Swoole Task任务使用
使用场景:
- 使用场景:
- 应用
-
- Ws.php
- index.html
- 预览
执行耗时操作(发送邮件 广播等)
如何使用 onTask onFinish 设置task_worker_num
应用 Ws.phpCONST 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();
运行服务
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); }关注打赏