常规定时器:
首先想到的就是Linux自带的crontab ,不过这个定时器是分钟级别的.
swoole定时器
-
毫秒定时器!
-
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
清除该定时器
-
-
swoole_timer_after($after_time, $callback)
设置一个延时器swoole_timer_afer
是一个一次性的定时器,会在设置的时间到了之后,立马执行一个操作.并且只会执行一次,与PHP中的sleep
函数不同的是,after
是非阻塞的. 而sleep
在调用之后会导致当前的进程进入阻塞状态,无法处理新的请求$afer_time
是延迟的时间.单位是毫秒 ,如1000
代表就是一秒钟,最大不超过86400000
$callback
指定时间到了之后需要执行的操作- 返回参数是一个timer_id,用于
swoole_timer_clear
清除该定时器
-
swoole_timer_clear($timer_id)
清除指定的定时器$timer_id
,定时器ID,调用swoole_timer_tick
、swoole_timer_after
后会返回一个整数的IDswoole_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为
定时器的所有操作都是异步的