1. 程式人生 > >swoole學習之毫秒定時器

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為

在這裡插入圖片描述

定時器的所有操作都是非同步的