Swoole学习(五)之Task任务
task模块用来做一些异步的慢速任务,比如webim中发广播,发送邮件,异步订单处理、异步支付处理等。
- task进程必须是同步阻塞的
- task进程支持定时器
假如有10万个连接,要发广播时,那会循环10万次,这时候程序不能做任何事情,不能接受新的连接,也不能收包发包。
而swoole不同,丢给task进程之后,worker进程可以继续处理新的数据请求。任务完成后会异步地通知worker进程告诉它此任务已经完成。
<?php class Websocket { private $server = null; public function __construct() { $this->server = new swoole_websocket_server("0.0.0.0", 9578); $this->server->set([ 'task_worker_num' => 8, // 启动8个进程来接收异步任务 'worker_num' => 8, ]); $this->server->on("open", [$this, "onOpen"]); $this->server->on("message", [$this, "onMessage"]); $this->server->on("task",[$this,"onTask"]); $this->server->on("finish", [$this, "onFinish"]); $this->server->on("close", [$this, "onClose"]); $this->server->start(); } public function onOpen($server, $request) { $server->push($request->fd, "连接数{$request->fd}"); } public function onMessage($server, $frame) { $server->task([ 'fd' => $frame->fd, 'content' => $frame->data ]); $server->push($frame->fd, "服务器返回" . $frame->data . ",时间" . date('Y-m-d H:i:s')); } // 处理异步任务 public function onTask($server, $task_id, $src_worker_id, $data) { sleep(10); //等待10秒 $server->push($data['fd'], "任务id" . $task_id . ",服务器返回" . $data['content'] . ",时间" . date('Y-m-d H:i:s')); } // 将task任务进程的处理结果通过finish返回给worker进程 public function onFinish($server, $task_id, $data) { echo "AsyncTask[$task_id] Finish: $data"; } public function onClose($server, $fd) { echo "client {$fd} closed\n"; } } $obj = new Websocket();
php a.php
运行结果