swoole学习之毫秒定时器

常规定时器:

首先想到的就是Linux自带的crontab ,不过这个定时器是分钟级别的.

swoole定时器
  • 毫秒定时器!

    1. swoole_timer_tick($msec,$callback) 设置一个定时器

      • swoole_timer_tick 在设置了之后,会一直持续的触发,直到使用swoole_timer_clear清除

      • $mesc 执行间隔时间.单位是毫秒 ,如1000代表就是一秒钟,最大不超过86400000

      • $callback指定时间到了之后需要执行的操作

      • 可以使用匿名函数的use语法传递参数到回调函数中

      • 定时器仅在当前进程空间内有效

      • 定时器是纯异步实现的,不能与阻塞IO的函数一起使用,否则定时器的执行时间会发生错乱

      • 回调函数中,有两个参数:

        callback($timer_id,$param)
        $timer_id定时器的ID ,用于swoole_timer_clear清除此定时器
        $param不是很懂…

      • 返回参数是一个timer_id.用于swoole_timer_clear清除该定时器

    2. swoole_timer_after($after_time, $callback) 设置一个延时器

      • swoole_timer_afer是一个一次性的定时器,会在设置的时间到了之后,立马执行一个操作.并且只会执行一次,与PHP中的sleep函数不同的是,after是非阻塞的. 而sleep在调用之后会导致当前的进程进入阻塞状态,无法处理新的请求
      • $afer_time是延迟的时间.单位是毫秒 ,如1000代表就是一秒钟,最大不超过86400000
      • $callback指定时间到了之后需要执行的操作
      • 返回参数是一个timer_id,用于swoole_timer_clear清除该定时器
    3. swoole_timer_clear($timer_id)清除指定的定时器

      • $timer_id,定时器ID,调用swoole_timer_tickswoole_timer_after后会返回一个整数的ID
      • swoole_timer_clear不能用于清除其他进程的定时器,只作用于当前进程
代码

$server->on('open',function($server, $request){
	//当fd为1的时候,也就是第一次有客户端连接的时候,调用定时器每隔两秒输出一条信息
	  if($request->fd == 1){
           $timer_id =  swoole_timer_tick(2000,function($timer_id){
                echo "2s , timerId :{$timer_id} \n";
            });
			//10s过后将定时器清除
            swoole_timer_after(10000,function () use($timer_id){
                echo "10s later , the timer: {$timer_id} is cleared \n";
                swoole_timer_clear($timer_id);
            });
        }
});


我在fd为1的时候开启定时器,
并想在fd为2 的时候 关闭定时器,
但我一直在报错.我想应该是在不同的连接中, timerid是不可以共享的
通过代码验证:

$server->on('open',function($server, $request){
        if($request->fd == 1){

            $timer_id = swoole_timer_tick(2000,function($timer_id) use($request){
                echo "fd {$request->fd }: 2s , timerId :{$timer_id} \n";
            });
        }

        if($request->fd == 2){
            $timerId = swoole_timer_tick(2000,function ($timer_id) use($request){
                echo "fd {$request->fd }: 2s , timerId :{$timer_id} \n";
            });
        }
        @var_dump($timer_id);
        @var_dump($timerId);
});

我们通过两个客户端,同时连接服务端. 然后查看打印信息:

发现,在不同的客户端连接中,timerId都是一样的. 所以不能在fd为

在这里插入图片描述

定时器的所有操作都是异步的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值