2018年swoole实战3-异步毫秒定时器

继上篇 2018年swoole实战2-异步非阻塞投递任务

项目中需要使用定时器时,crontab是常用的选择,不过crontab的粒度太大,最小时间单位是分钟级别,如果我们要设置秒级,甚至毫秒级的定时器,crontab就爱莫能助了,而且crontab是在服务器设置,脱离了业务代码,增加了维护成本。

swoole内置了 异步毫秒定时器,一看这名称就觉得酷炫狂霸拽

老规矩,继续用大刘的《三体》作为场景模拟:

服务端

新建 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,
            ]
        );
        $this->ws->on('open', [$this, 'onOpen']);
        $this->ws->on('message', [$this, 'onMessage']);
        $this->ws->on('close', [$this, 'onClose']);

        $this->ws->start();
    }

    /**
     * 监听连接事件
     * @param $ws
     * @param $request
     */
    public function onOpen($ws, $request) {
    }

    /**
     * 监听数据发送事件
     * @param $ws
     * @param $frame
     */
    public function onMessage($ws, $frame) {

        $timer = swoole_timer_tick(1000, function() use ($ws, $frame){
            $time = date("H:i:s");
            $message = "水滴穿过人类星际飞船,犹如石头穿过水中一样,一连串的飞船都报废了... {$time}";
            $ws->push($frame->fd, $message);
        });

        swoole_timer_after(5000, function() use($ws, $frame, $timer) {
            $ws->push($frame->fd, "攻击结束,除了蓝色空间和青铜时代两艘飞船逃逸之外,其他都挂了,地球文明快完蛋了" . date('H:i:s'));
            swoole_timer_clear($timer);
        });

        $ws->push($frame->fd, "水滴已经被人类捕获,开始启动攻击指令,他们还以为是我们送来的表示和平的礼物,甚至称其为圣母的眼泪,哈哈哈...");
    }

    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>
<script>
    let wsUrl = "ws://127.0.0.1:8812"
    let webSocket = new WebSocket(wsUrl) // 建立请求连接

    webSocket.onopen = function(evt) {
        let 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 14:10:03 @62813.0]  TRACE   Create swoole_server host=0.0.0.0, port=8812, mode=3, type=1
定时器

如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 89,700评论 13 124
  • date: 2017-12-14 21:34:51title: swoole 在 swoft 中的应用 swoft...
    daydaygo阅读 3,414评论 10 12
  • 计算机很擅长多任务操作。为了编写出好的软件我们需要对多任务操作和异步有个很好的了解。在Android上面这些包括了...
    宛丘之上兮阅读 4,033评论 2 1
  • 今天黄黄被表白,开心的耶。我们寝室能有人被表白真的挺开心的。 班级送别会,送走那些曾经有缘的人。 说散就散,散了的...
    剪拣阅读 36评论 0 0
  • 当胆小变成习惯更多的是不甘心 我现在一无所有 很多事要做 如何同时做很多事又可以做好 对,我就是完美主义者很多期待...
    从1到10到100阅读 26评论 0 0