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
运行结果