swoole學習之毫秒定時器
阿新 • • 發佈:2018-12-14
常規定時器:
首先想到的就是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為
定時器的所有操作都是非同步的