专栏首页新亮笔记《一》Swoole Timer 的应用

《一》Swoole Timer 的应用

你好,Swoole

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')."\n";
});

//9000ms后删除定时器
swoole_timer_after(9000, function () use ($timer_id) {
    echo "after 9000ms - ".date('Y-m-d H:i:s')."\n";
    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.")\n";
    if ($result) {
        //业务代码...
        swoole_timer_clear($timer_id); // 停止定时器
        echo date('Y-m-d H:i:s'). " 第(".$exec_num.")次请求接口任务执行成功\n";
    } else {
        if ($exec_num >= 5) {
            swoole_timer_clear($timer_id); // 停止定时器
            echo date('Y-m-d H:i:s'). " 请求接口失败,已失败5次,停止执行\n";
        } else {
            echo date('Y-m-d H:i:s'). " 请求接口失败,5分钟后再次尝试\n";
        }
    }
});

运行结果:

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

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

参考文档

  • https://wiki.swoole.com/wiki/page/p-timer.html

原文地址

https://mp.weixin.qq.com/s/9ek_Ol-mLRQCPOTyl8v9Zg

本文分享自微信公众号 - 新亮笔记(XinLiangTalk),作者:訢亮

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-08

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [系列] - 使用 go modules 包管理工具(一)

    我想实现一个开箱即用的 API 框架的轮子,这个轮子是基于 Gin 基础上开发的。

    新亮
  • Go gRPC Hello World

    开始 gRPC 了,这篇文章学习使用 gRPC,输出一个 Hello World。

    新亮
  • 《二》Swoole Task 的应用

    Swoole 的实现方式是 worker 进程处理数据请求,分配给 task 进程执行。

    新亮
  • 04Linux的磁盘分区

    硬件设备在Linux中的命名 Linux中每一个设备都被当成文件,所有的设备文件都在/dev这个目录下。 设备 文件名 IDE硬盘 /dev/hd[...

    大闲人柴毛毛
  • 音视频混流基本原理

    在直播场景里,我们经常需要将多个视频画面混合成一个视频画面(或是多路音频合成一路声音),常见的场景如:

    jansonjiang
  • EasyNVR二次开发云台控制接口实例

    EasyNVR能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IP Camera、NVR等具有RTSP协议输出的设备接入到EasyNVR,E...

    EasyNVR
  • EasyNVR网页Chrome无插件播放摄像机视频功能二次开发之云台控制接口示例代码

    随着多媒体技术和网络通信技术的迅速发展,视频监控技术在电力系统、电信行业、工业监控、工地、城市交通、水利系统、社区安防等领域得到越来越广泛的应用。摄像头直播视频...

    EasyNVR
  • Android Studio: 调试的技巧与心得 | AndroidDevSummit 中文字幕视频

    在本场演讲中,David Herman 和 Justin Nieto 将为大家演示 Android Studio 中强大好用的调试功能,相信不论您是初学者还是...

    Android 开发者
  • 分布式任务调度系统xxl-job源码探究(一、客户端)

    老梁
  • 习题8:打印,打印

    1 2 3 4 one two three four True False False True {} {} {} {} {} {} {} {} {} {} {...

    py3study

扫码关注云+社区

领取腾讯云代金券