• Swoole Timer 的应用


    你好,Swoole

    这是关于 Swoole 学习的第一篇文章:Swoole Timer 的应用。

    PHP 的协程高性能网络通信引擎,使用 C/C++ 语言编写,提供了多种通信协议的网络服务器和客户端模块。

    Swoole 可应用于互联网、移动通信、企业软件、网络游戏、物联网、车联网、智能家庭等领域。

    学习 Swoole 之前,最好先了解下底层知识,比如,线程/进程、IO、TCP/IP协议 等。

    推荐大家读一下《Linux 高性能服务器编程》这本书。我有这本书的PDF版,需要的可以关注公众号,回复 “Linux 高性能服务器编程” 即可获取。

    这篇文章主要分享 Timer 毫秒精度的定时器。

    本地版本:PHP 7.2.6、Swoole 4.3.1。

    Timer

    主要有三个方法:

    swoole_timer_tick 间隔的时钟控制器

    swoole_timer_after 指定的时间后执行

    swoole_timer_clear 删除定时器

    示例代码:

    //每隔3000ms触发一次
    $timer_id = swoole_timer_tick(3000, function () {
        echo "tick 3000ms - ".date('Y-m-d H:i:s')."
    ";
    });
    
    //9000ms后删除定时器
    swoole_timer_after(9000, function () use ($timer_id) {
        echo "after 9000ms - ".date('Y-m-d H:i:s')."
    ";
        swoole_timer_clear($timer_id);
    });
    

    运行结果:

    tick 3000ms - 2019-04-07 21:36:56
    tick 3000ms - 2019-04-07 21:36:59
    tick 3000ms - 2019-04-07 21:37:02
    after 9000ms - 2019-04-07 21:37:02
    
    

    应用场景

    一、比如,每天凌晨跑业务脚本,脚本中包括了请求其他业务方或第三方的接口,如果接口超时无响应或没有数据返回,需要进行重试。

    重试机制为:每5隔分钟再发送一次请求,最多尝试5次,在5次内成功停止该任务,5次仍失败也停止该任务。

    示例代码:

    $api_url  = 'xxx'; //接口地址
    $exec_num = 0;     //执行次数
    swoole_timer_tick(5*60*1000, function($timer_id) use ($api_url, &$exec_num) {
        $exec_num ++ ;
        $result = $this->requestUrl($api_url);
        echo date('Y-m-d H:i:s'). " 执行任务中...(".$exec_num.")
    ";
        if ($result) {
            //业务代码...
            swoole_timer_clear($timer_id); // 停止定时器
            echo date('Y-m-d H:i:s'). " 第(".$exec_num.")次请求接口任务执行成功
    ";
        } else {
            if ($exec_num >= 5) {
                swoole_timer_clear($timer_id); // 停止定时器
                echo date('Y-m-d H:i:s'). " 请求接口失败,已失败5次,停止执行
    ";
            } else {
                echo date('Y-m-d H:i:s'). " 请求接口失败,5分钟后再次尝试
    ";
            }
        }
    });
    

    运行结果:

    2019-04-07 21:40:48 执行任务中...(1)
    2019-04-07 21:40:48 请求接口失败,5分钟后再次尝试
    2019-04-07 21:45:48 执行任务中...(2)
    2019-04-07 21:45:48 请求接口失败,5分钟后再次尝试
    2019-04-07 21:50:48 执行任务中...(3)
    2019-04-07 21:50:48 请求接口失败,5分钟后再次尝试
    2019-04-07 21:55:48 执行任务中...(4)
    2019-04-07 21:55:48 请求接口失败,5分钟后再次尝试
    2019-04-07 22:00:48 执行任务中...(5)
    2019-04-07 22:00:48 请求接口失败,已失败5次,停止执行
    

    二、比如,设计一个用WEB界面管理管理定时任务的系统。

    Linux Crontab 最小时间粒度为分钟。

    PHP Swoole 最小时间粒度为毫秒。

    0   1   2   3   4   5
    |   |   |   |   |   |
    |   |   |   |   |   +------ day of week (0 - 6) (Sunday=0)
    |   |   |   |   +------ month (1 - 12)
    |   |   |   +-------- day of month (1 - 31)
    |   |   +---------- hour (0 - 23)
    |   +------------ min (0 - 59)
    +-------------- sec (0-59)
    

    WEB界面管理

    • 登录、权限管理
    • 任务管理(增删改查)
    • 脚本机管理(机器IP地址)
    • 任务日志

    项目地址

    https://github.com/osgochina/Donkey

    三、比如,监控服务器状况。

    参考文档

    本文欢迎转发,转发请注明作者和出处,谢谢!

  • 相关阅读:
    [每日一题系列] LeetCode 1071. 字符串的最大公因子
    [每日一题系列] LeetCode 1013. 将数组分成和相等的三个部分
    git diff (19)
    WinDbg探究CLR底层(1)
    使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
    转MySQL遇到的语法差异及解决方案
    批量拼脚本神器-NimbleText
    Visual Studio 2017中使用正则修改部分内容
    如何使用ILAsm与ILDasm修改.Net exe(dll)文件
    在Windows上安装Elasticsearch v5.4.2
  • 原文地址:https://www.cnblogs.com/xinliangcoder/p/10792370.html
Copyright © 2020-2023  润新知