你好,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')."\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

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

参考文档

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

Swoole Timer 的应用的更多相关文章

  1. Swoole 中毫秒定时器(Timer)的使用

    间隔定时器, tick 定时器会持续触发,直到调用 clear() 清除为止. $timer = Swoole\Timer::tick(3000, function (int $timer_id, $ ...

  2. swoole创建工作进程,执行滞后工作

    一,创建守候进程,因为这里不需要Server,也没有Client,数据交换通过redis进行 <?php namespace Kuba\Saas; require_once __DIR__ . ...

  3. Swoole Task 的应用

    目录 概述 代码 小结 扩展 参考文档 概述 Swoole 异步Task,主要实现调用异步任务的执行. 常用的场景:异步支付处理.异步订单处理.异步日志处理.异步发送邮件/短信等. Swoole 的实 ...

  4. Swoole 整合成一个小框架

    目录 概述 效果 代码 小结 概述 这是关于 Swoole 学习的第六篇文章:Swoole 整合成一个小框架. 第五篇:Swoole 多协议 多端口 的应用 第四篇:Swoole HTTP 的应用 第 ...

  5. Swoole MySQL 连接池的实现

    目录 概述 代码 扩展 小结 概述 这是关于 Swoole 入门学习的第八篇文章:Swoole MySQL 连接池的实现. 第七篇:Swoole RPC 的实现 第六篇:Swoole 整合成一个小框架 ...

  6. Swoole 多协议 多端口 的应用

    目录 概述 网络通信协议设计 多端口监听的使用 小结 概述 这是关于 Swoole 学习的第五篇文章:Swoole 多协议 多端口 的应用. 第四篇:Swoole HTTP 的应用 第三篇:Swool ...

  7. Swoole HTTP 的应用

    目录 概述 代码 小结 扩展 概述 这是关于 Swoole 学习的第四篇文章:Swoole HTTP 的应用. 第三篇:Swoole WebSocket 的应用 第二篇:Swoole Task 的应用 ...

  8. Swoole WebSocket 的应用

    目录 概述 代码 小结 概述 这是关于 Swoole 学习的第三篇文章:Swoole WebSocket 的应用. 第二篇:Swoole Task 的应用 第一篇:Swoole Timer 的应用 什 ...

  9. Swoole RPC 的实现

    目录 概述 实现效果 代码 小结 概述 这是关于 Swoole 学习的第七篇文章:Swoole RPC 的实现. 第六篇:Swoole 整合成一个小框架 第五篇:Swoole 多协议 多端口 的应用 ...

随机推荐

  1. 工作记录(JS向textarea添加固定内容、通过固定字符将字符串分割为数组)

    第一个是在 textarea 输入框中添加固定的内容. 代码如下: <textarea id="text" cols="30" rows="10 ...

  2. 怎样删除PeopleSoft进程服务器定义

    比如在克隆环境时候,把生产的环境克隆到DEV环境,你可能会在进程调度服务器中看到了生产的进程服务器,例如:你可能会在进程调度的时候选择一个server,但是这个server并没有在psadmin下创建 ...

  3. Windows10系统的Linux子系统中安装MySQL数据库心得

    后端开发童鞋们, 自己开发机用的是Windows系统电脑(台式机或笔记本), 而开发的程序和使用的数据库等要运行在Linux服务器上, 这种情况有木有? 提前声明: 本文并不讨论操作系统的比较, 以及 ...

  4. python unnitest 经验总结

    由于我的用例是数据驱动,每个用例保存为一个txt或者xls文件,执行时候需要读取文件,并将所有变量实例化成一个用例: 之前自己设计了框架,由于考虑需要生成一个美观通用的报告格式(原格式都是手写的htm ...

  5. python 之__new__

    注意: 继承自object的新式类才有__new__方法 类中的__init__方法依赖__new__方法的正确返回,init中的self就是__new__返回的实例 __new__至少要有一个参数c ...

  6. jboss-as- 7.1.1.Final配置jndi数据源

    初次使用jboss7.1.1.final部署项目,遇到了很多困难,最终通过查看官方文档和网上资料得以解决,特此记录一下. error information 2016-05-12 12:53:20 J ...

  7. springMvc之文件上传与下载

    我们经常会使用的一个功能是文件下载,既然有文件下载就会有文件上传,下面我们来看一下文件上传是如何实现的 首先准备好一个页面 <style type="text/css"> ...

  8. 解决:Tomcat 局域网IP地址 访问不了

    解决:Tomcat 局域网IP地址 访问不了 2014年10月17日 ⁄ 综合 ⁄ 共 1000字 ⁄ 字号 小 中 大 ⁄ 评论关闭 如果连最基本的localhost:8080都失败的话. 原因就一 ...

  9. 将TXT文件 导入 sqlserver数据库

    情景一:​ 数据库已存在旧表名 old_table,列名old_column_name. 将TXT文件导入数据库已存在旧表old_table中,导入过程中需注意 数据源中列名可全部不修改 或 全部修改 ...

  10. .NET实现自动编译

    前言 因每次发布版本的时候,都需要打开vs项目,然后进行编译.如果刚好手里有文件在修改,就需要先签入之类的.所以想找个可以实现自动编译的工具. 在网上查询了不少资料,终于基本上实现了自动编译的功能.因 ...