使用场景(非常重要)
- 执行耗时的操作(发送邮件,广播等)
- 计算服务
如何使用:
- onTask
- onFinish
- 设置task_worker_num
ws_server_opt.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
<?php /** * Created by bingxiong. * Date: 4/15/18 * Time: 7:39 PM * Description: websocket优化-面向对象-task异步任务投放 */ 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->on("open",[$this,'onOpen']); $this->ws->on("message",[$this,'onMessage']); $this->ws->on("task",[$this,'onTask']); $this->ws->set([ 'worker_num' => 2, 'task_worker_num' => 2, ]); $this->ws->on("finish",[$this,'onFinish']); $this->ws->on("close",[$this,'onClose']); $this->ws->start(); } /** * 监听ws打开事件 * @param $ws * @param $request */ public function onOpen($ws,$request){ var_dump($request->fd); } /** * 监听ws消息事件 * @param $ws * @param $frame */ public function onMessage($ws,$frame){ echo "server-push-message:{$frame->data}\n"; // todo 10s $data=[ 'task'=>1, 'fd'=>$frame->fd, ]; $ws->task($data); // 返回信息给客户端 $ws->push($frame->fd,"server-push:".date("Y-m-d H:i:s")); } /** * @param $serv * @param $taskId * @param $workerId * @param $data */ public function onTask($serv,$taskId,$workerId,$data){ print_r($data); // 模拟耗时场景 sleep(10); return "on task finish"; // 告诉worker进程 } public function onFinish($serv,$taskId,$data){ echo "taskId:{$taskId}\n"; echo "finish-data-success:{$data}\n"; } /** * 监听关闭事件 * @param $ws * @param $fd */ public function onClose($ws,$fd){ echo "clientId:{$fd}\n"; } } $obj = new Ws(); |
命令行结果:
客户端结果:
NOTE:
- 如果说按照同步的执行方式,应该先会等待10s后才会在控制台打印出ws-server-return-data,采用了task之后会在第一时间打印出,不会再sleep的位置停止,而是直接将sleep这个任务交给了task_worker池中。
-
swoole_server->task 投递一个异步任务到
task_worker
池中。此函数是非阻塞的,执行完毕会立即返回。Worker
进程可以继续处理新的请求。使用Task
功能,必须先设置 task_worker_num,并且必须设置Server
的onTask
和onFinish
事件回调函数。 - 这是在websocket基础上进行的异步任务投放,还可以应用到httpServer及更多的场景中。