专栏首页coding2018年swoole实战2-异步非阻塞投递任务服务端客户端启动服务代码解析

2018年swoole实战2-异步非阻塞投递任务服务端客户端启动服务代码解析

继上篇 2018年swoole实战1-初识swoole

项目中,总有一些场景会触发耗时比较长的行为。如:用户更新了文章,触发推送消息给此用户的所有粉丝,如果一个用户有10000个粉丝,用同步阻塞的方式来实现,肯定会被吐槽死,这种场景必须用非阻塞的方式实现,让用户无感知。

swoole的task任务投递功能可实现异步非阻塞的功能

以下通过三体人与ETO组织的对话场景来模块此功能:

废话不多说,亮代码吧...

服务端

新建 server.php

<?php

class WebSocket {
    const HOST = '0.0.0.0';
    const PORT = 8812;
    public $ws = null;
    public function __construct()
    {
        $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
        $this->ws->set(
            [
                'worker_num' => 2,
                'task_worker_num' => 2,
            ]
        );
        $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();
    }

    /**
     * 监听连接事件
     * @param $ws
     * @param $request
     */
    public function onOpen($ws, $request) {
        echo "收到地球人的连接请求,客户端id:{$request->fd}\n";
    }

    /**
     * 监听数据发送事件
     * @param $ws
     * @param $frame
     */
    public function onMessage($ws, $frame) {
        echo "地球人发送的数据:{$frame->data}\n";
        echo "元首:让他们去清理掉面壁者吧...\n";
        // 投递任务
        $data = [
            'task' => '全力加速水滴...\n',
            'fd' => $frame->fd,
        ];
        $time = date('Y-m-d H:i:s', time());
        $ws->push($frame->fd, "清理所有的面壁者, 重点是要不引起任何人注意,无声无息地干掉罗辑!" . $time);
        $ws->task($data); // 投递任务
        $time = date('Y-m-d H:i:s', time());
        $ws->push($frame->fd, "接下来会有水滴协助你们,水滴已经在加速前进了,等水滴到达,我们就无所畏惧了... " . $time);
    }

    /**
     * 执行投递的任务
     * @param $server
     * @param $taskId
     * @param $workerId
     * @param $data
     * @return array
     */
    public function onTask($server, $taskId, $workerId, $data) {
        echo $data['task'];
        sleep(5);
        $time = date('Y-m-d H:i:s', time());
        return [
            'fd' => $data['fd'],
            'message' => '水滴加速完成 ' . $time,
        ];
    }

    /**
     * 任务完成后的回调
     * @date 2018-07-27
     * @param $server
     * @param $taskId
     * @param $data
     */
    public function onFinish($server, $taskId, $data) { // $data 是 onTask 返回的内容
        $server->push($data['fd'], $data['message']); // 通知客户端,任务已经完成
    }

    public function onClose($ws, $fd) {

    }

}

$obj = new WebSocket();

客户端

新建 client.html

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>webSocket客户端</title>
</head>
<body>
<h1>swoole异步非阻塞投递任务</h1>
<script>
    let wsUrl = "ws://127.0.0.1:8812"
    console.log("ETO:向三体世界发送连接请求")
    let webSocket = new WebSocket(wsUrl) // 建立请求连接

    webSocket.onopen = function(evt) {
        let message = "主啊,请下达任务,我们必将完成!"
        console.log("ETO:" + message)
        webSocket.send(message); // 发送数据到服务端
    }

    webSocket.onmessage = function(evt) { // 接收服务端数据
        let message = String(evt.data)
        console.log("三体人:" + message)
    }

    webSocket.onclose = function(evt) {
        console.log("地球与三体的连接已中断")
    }

    webSocket.onerror = function(evt, e) {
        let message = String(evt.data)
        console.log("连接出错:" + message)
    }
</script>

</body>
</html>

启动服务

☁  ws  php server.php
[2018-07-27 11:50:13 @59805.0]  TRACE   Create swoole_server host=0.0.0.0, port=8812, mode=3, type=1

client

代码解析

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ISUX Xcube智能一键生成H5

    腾讯ISUX
  • 白底黑字or黑底白字,眼睛更喜欢哪一个?

    腾讯大讲堂
  • 考研英语-1-导学

    英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

    用户1335799
  • SQL中GROUP BY用法示例

    GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

    Awesome_Tang
  • 不只是软件,在线也可以免费下载百度文库了。

    不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

    课代表
  • 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

    haifeiWu
  • 中国互联网协会发布:《2018中国互联网发展报告》

    在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

    钱塘数据
  • 理工男图解零维到十维空间,烧脑已过度,受不了啦!

    让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

    钱塘数据
  • 【系统设置】CentOS 修改机器名

    ken.io
  • 知识体系解决迷茫的你

    最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

    桃翁

扫码关注云+社区

领取腾讯云代金券