swoole Task 任务

<?php
class Ws{
    const HOST = '0.0.0.0';	// 监听的IP地址, 0.0.0.0 表示监听所有IP地址
    const PROT = '9504';

    public $ws = null;	// 存放websocket连接资源
    public $config = [
		// 进程数
        'worker_num' => 2,
        // Task 进程的数量
        'task_worker_num' => 2,
	];
	
    public function __construct()
    {
    	// 创建 websocket server对象
        $this->ws = new swoole\websocket\server(self::HOST, self::PROT);
		// 设置参数
        $this->ws->set($this->config);
		// 监听websocket连接事件
        $this->ws->on('open', [$this, 'onOpen']);
        // 监听websocket消息事件
        $this->ws->on('message', [$this, 'onMessage']);
        // 向 task_worker 进程投递新的任务
        $this->ws->on('task', [$this, 'onTask']);
        // 异步任务执行成功时调用
        $this->ws->on('finish', [$this, 'onFinish']);
        // 监听websocket连接关闭事件
        $this->ws->on('close', [$this, 'onClose']);
		// 启动服务
        $this->ws->start();
    }

    /**
     * 监听websocket连接事件
     * @param $ws
     * @param $request
     */
    public function onOpen($ws, $request)
    {
        var_dump($request->fd);
    }

    /**
     * 监听websocket消息事件
     * @param $ws
     * @param $frame
     */
    public function onMessage($ws, $frame)
    {
        echo '消息:'. $frame->data. PHP_EOL;
        // 投放异步任务
        $data = [
            'task' => 1,
            'fd' => $frame->fd
        ];
        $ws->task($data);
        // 发送消息给客户端
        $ws->push($frame->fd, '这是服务端发送的消息:'. date('Y-m-d H:i:s'));
    }

    /**
     * 向 task_worker 进程投递新的任务
     * @param $server   Swoole\Server 对象
     * @param $taskId   执行任务的 task进程id
     * @param $workerId 投递任务的 worker进程id
     * @param $data     任务的数据内容
     */
    public function onTask($server, $taskId, $workerId, $data)
    {
        var_dump('任务开始了'. json_encode($data));
        // 耗时场景 10s
        sleep(10);
        return 'task任务完成了';
    }

    /**
     * 异步任务执行成功时调用
     * @param $server     Swoole\Server 对象
     * @param $taskId   执行任务的 task 进程 id
     * @param $data     任务处理的结果内容
     */
    public function onFinish($server, $taskId, $data)
    {
        echo '任务id: '. $taskId. PHP_EOL;
        echo 'finish message: '. $data. PHP_EOL;
    }

    /**
     * 监听websocket连接关闭事件
     * @param $ws
     * @param $fd
     */
    public function onClose($ws, $fd)
    {
        echo '退出了:'. $fd. PHP_EOL;
    }
}

new Ws();

注:Task 任务是非阻塞的,执行完毕会立即返回。
使用 Task 功能,必须先设置 task_worker_num
并且必须设置 Server 的 onTaskonFinish 事件回调函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值