swoole系列之---定时器的简单理解和应用

32 篇文章 0 订阅
4 篇文章 1 订阅

实际应用项目:http://github.crmeb.net/u/long

 

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

Timer的定时器主要有以下三个方法

swoole_timer_tick 间隔的时钟控制器
swoole_timer_after 指定的时间后执行
swoole_timer_clear 删除定时器

 

示例代码:

//每隔5000ms触发一次
$timer_id = swoole_timer_tick(5000, function () {
    echo "设置 5000ms 时 ".date('Y-m-d H:i:s')."\n";
});

//8000ms后删除定时器
swoole_timer_after(8000, function () use ($timer_id) {
    echo "8000ms 之后 - ".date('Y-m-d H:i:s')."\n";
    swoole_timer_clear($timer_id);
});

 

得到的结果如下:

设置 5000ms - 2021-04-07 22:36:54
设置 5000ms - 2021-04-07 22:36:59
设置 5000ms - 2021-04-07 22:37:04
8000ms 之后 - 2021-04-07 22:37:03

 

以下有这么一个应用场景,可以借鉴一下

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

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

示例代码:

$api_url  = 'www.mano100.cn'; //接口地址
$exec_num = 0;     //执行次数

swoole_timer_tick(3*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 >= 3) {
            swoole_timer_clear($timer_id); // 停止定时器
            echo date('Y-m-d H:i:s'). " 请求接口失败,已失败3次,停止执行\n";

        } else {

            echo date('Y-m-d H:i:s'). " 请求接口失败,3分钟后再次尝试\n";
        }
    }
});

 

运行结果如下:

2021-04-07 22:40:48 执行任务中...(1)
2021-04-07 22:40:48 请求接口失败,5分钟后再次尝试
2021-04-07 22:43:48 执行任务中...(2)
2021-04-07 22:43:48 请求接口失败,5分钟后再次尝试
2021-04-07 22:48:48 执行任务中...(3)
2021-04-07 22:48:48 请求接口失败,5分钟后再次尝试
2021-04-07 22:53:48 执行任务中...(4)
2021-04-07 22:53:48 请求接口失败,5分钟后再次尝试
2021-04-07 22:58:48 执行任务中...(5)
2021-04-07 22:58:48 请求接口失败,已失败5次,停止执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值