swoole学习之 websocket中task任务使用案例

23 篇文章 0 订阅
9 篇文章 0 订阅

swoole学习之 websocket中task任务使用案例

websocket基础类增加task方法

<?php
/*优化websocket基础类
 *
 * */

class WsTask
{

    //定义host
    const HOST = '0.0.0.0';
    //定义端口号
    const PORT = 9502;
    //定义变量
    public $ws = '';

    //构造函数
    public function __construct()
    {
        $this->ws = new Swoole\WebSocket\Server(self::HOST, self::PORT);

        //设置参数
        $this->ws->set([
            'worker_num' => 2,//设置进程数
            'task_worker_num' => 2//设置task进程数
        ]);

        //定义方法
        $this->ws->on('open', [$this, 'onOpen']);
        $this->ws->on('message', [$this, 'onMessage']);
        //异步任务
        $this->ws->on('task', [$this, 'onTask']);
        //异步任务对应的结束方法
        $this->ws->on('finish', [$this, 'onFinish']);
        
        $this->ws->on('close', [$this, 'onClose']);
        //启动服务
        $this->ws->start();
    }

    //定义链接websocket服务事件的方法
    public function onOpen($ws, $request)
    {
        echo "得到客户端的request请求<pre>";
        print_r($request);
    }


    //定义websocket服务消息事件的方法
    public function onMessage($ws, $frame)
    {

        //加入要执行的任务
        $task_data = array(
            'task' => 1,
            'fd' => $frame->fd,
        );
        //执行任务
        $ws->task($task_data);
        echo '获取到客户端发送过来的数据' . $frame->data;
        //给客户端回应,发送内容
        $ws->push($frame->fd, 'wesocketServe-push-data:www.qipa250.com');
    }


    //定义异步task任务方法
    public function onTask($ws, $taskId, $workerId, $task_data)
    {
        echo "<pre>";
        print_r($task_data);
        echo '开始时间' . date('Y-m-d H:i:s', time()) . PHP_EOL;
        sleep(10);
        echo '结束时间' . date('Y-m-d H:i:s', time()) . PHP_EOL;
        return '执行finish方法';
    }

    //定义任务结束方法
    public function onFinish($ws, $taskId, $data)
    {
        echo '$taskId=' . $taskId . PHP_EOL;
        echo 'finish-data-sucess=' . $data . PHP_EOL;
    }


    //定义关闭websocket服务的方法
    public function onClose($ws, $fd)
    {
        echo '客户端:' . $fd . '断开了websocket服务!';
    }

}

//实例化

$ws = new WsTask();

?>

此段代码还是基于httpserver的,所以要启动httpserver服务

 php server/httpService.php

再启动websocket服务

php server/websocket.task.php

客户端websocket.html 代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>swoole学习之websocket_server服务器代码_徊忆羽菲的博客-CSDN博客</title>
</head>
<body>
<h1>websocket服务器基础类task异步任务测试</h1>

<script type="application/javascript">
    //定义一个websocket服务器的路径
    var wsUrl = 'ws://20.20.24.131:9502';

    var ws_server = new WebSocket(wsUrl);

    //实例化open属性 判断是否链接websocket成功
    ws_server.onopen = function (evt) {

        //发送数据
        ws_server.send('hello websocket!');
        console.log('connect-swoole-websocket-success');
    }

    //实例化onmessage
    ws_server.onmessage = function (evt) {
        console.log('connect-swoole-websocket-message', evt.data);
    }

    //实例化close
    ws_server.onclose = function (evt) {
        console.log('connect-swoole-websocket-close');
    }

    //实例化close
    ws_server.onerror = function (evt, e) {
        console.log('connect-swoole-websocket-error', e.errorCode);
    }


</script>

</body>
</html>

效果

在浏览中访问

http://20.20.24.131:9501/websocket.html

在这里插入图片描述可以看到,客户端,很快收到了服务端发送的数据,并没有等待10秒

而服务端收到客户端的数据并打印

在这里插入图片描述可以看到服务端优先给客户端返回数据之后,等待了10s,再去执行了finish方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值