swoole入门 第二个程序 timer定时任务

一、swoole 定时器

  • Linux Crontab 最小时间粒度为分钟。
  • PHP Swoole 最小时间粒度为毫秒。
  • swoole_timer_tick() 间隔的时钟控制器
  • swoole_timer_after() 指定的时间后执行
  • swoole_timer_clear() 删除定时器

例子-可复制直接执行

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

二、 架构图

三、开源项目 https://github.com/osgochina/swoole-crontab

四、业务场景

  1. 系统日常监控
  2. 每天凌晨跑业务脚本,脚本中包括了请求其他业务方或第三方的接口,如果接口超时无响应或没有数据返回,需要进行重试。
  3. 定时任务处理半小时未支付订单

场景二代码(不能单独执行 仅示例):

$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";
        }
    }
});

文章整理学习于https://github.com/xinliangnote/Swoole

彼特城博客
请先登录后发表评论
  • latest comments
  • 总共0条评论