您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何分析Swoole中定時器的使用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
先說說原生PHP如何實現定時器,PHP的定時器是通過pcntl_alarm實現的:
pcntl_alarm ( int $seconds ) : int
pcntl_alarm 函數的作用是為進程設置一個alarm鬧鐘信號。調用這個方法后會創建一個計數器,在指定的秒數后向進程發送一個SIGALRM信號。每次對 pcntl_alarm 的調用都會取消之前設置的alarm信號。
其中,$seconds 為等待的秒數,如果 $seconds 設置為0,將不會創建alarm信號。調用這個函數后返回上次alarm調度剩余的秒數,或者之前沒有alarm調度時返回0。
下面我們看一個例子,pcntl_signal() 函數安裝信號處理器,pcntl_signal_dispatch() 調用等待信號的處理器。
pcntl_alarm() 函數是基于時鐘信號 + tick函數實現的,存在一些缺陷:
最大進支持到秒,而Swoole Timer可以到毫秒級別
不支持同時設定多個定時器程序
pcntl_alarm() 依賴 declare(ticks = 1),性能很差
Swoole中的定時器可以達到毫秒精度,同時可以支持添加大量定時器。
在Swoole中可以使用 Timer::tick 來設置一個間隔時鐘定時器,調用Timer::clear來清除定時器。函數定義如下:
int Swoole\Timer::tick(int $msec, callable $callback, ……$params);
這個函數的別名是 swoole_timer_tick()。$msec 為指定的時間,單位是毫秒。$callback 為時間到期后執行的函數。$callback 回調函數會接收多個參數,第一個是定時器的ID。注意:定時器僅在當前進程空間內有效。定時器是純異步實現的,不能與阻塞IO的函數一起使用,否則定時器的執行時間會發生錯亂。
下面是定時器在 websocket 的 onMessage 回調函數中的一個 demo,
觸發 onMessage 回調后在客戶端打印出如下信息,截圖
除此之外swoole還提供了另外一個函數 Timer::after 來實現定時器,這個函數是的作用是在指定時間后執行回調函數。函數原型如下:
int Swoole\Timer::after(int $after_time_ms, callable $callback_function, ……$params);
這個函數的別名是 swoole_timer_after。Timer::after是一個一次性定時器,執行完成后就會銷毀。示例代碼如下:
除了設置定時器的函數外,Swoole還提供了另外幾個函數:
function Timer::set(array $array); //設置定時器的參數
Timer\Iterator Timer::list();//返回定時器迭代器, 可使用foreach遍歷全局所有timer的id
array Timer::info(int $id);//返回timer的信息
bool Swoole\Timer::clear(int $timer_id);//使用定時器ID來刪除定時器
bool Timer::clearAll();//清除當前工作進程內的所有定時器
Swoole定時器底層是基于epoll_wait 和 setitimer 實現,數據結構使用的是最小堆。
Swoole定時器回調函數的執行時間不影響下一次定時器執行的時間。如果定時器回調函數的執行時間過長,甚至覆蓋了下一次定時器執行的時間。底層會進行時間校正,丟棄已過期的行為,在下一時間回調。關于如何分析Swoole中定時器的使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。