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

 运行结果

Swoole学习(五)之Task任务