亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析Swoole中定時器的使用

發布時間:2022-01-15 13:35:46 來源:億速云 閱讀:122 作者:柒染 欄目:大數據

這篇文章給大家介紹如何分析Swoole中定時器的使用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一、PHP本身的定時器介紹

先說說原生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() 調用等待信號的處理器。

如何分析Swoole中定時器的使用

pcntl_alarm() 函數是基于時鐘信號 + tick函數實現的,存在一些缺陷:

最大進支持到秒,而Swoole Timer可以到毫秒級別

不支持同時設定多個定時器程序

pcntl_alarm() 依賴 declare(ticks = 1),性能很差

二、Swoole中定時器的使用方法

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,

如何分析Swoole中定時器的使用

觸發 onMessage 回調后在客戶端打印出如下信息,截圖

如何分析Swoole中定時器的使用

除此之外swoole還提供了另外一個函數 Timer::after 來實現定時器,這個函數是的作用是在指定時間后執行回調函數。函數原型如下:

int Swoole\Timer::after(int $after_time_ms, callable $callback_function, ……$params);

這個函數的別名是 swoole_timer_after。Timer::after是一個一次性定時器,執行完成后就會銷毀。示例代碼如下:

如何分析Swoole中定時器的使用

除了設置定時器的函數外,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定時器的底層原理

Swoole定時器底層是基于epoll_wait 和 setitimer 實現,數據結構使用的是最小堆

Swoole定時器回調函數的執行時間不影響下一次定時器執行的時間。如果定時器回調函數的執行時間過長,甚至覆蓋了下一次定時器執行的時間。底層會進行時間校正,丟棄已過期的行為,在下一時間回調。關于如何分析Swoole中定時器的使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浦城县| 福鼎市| 南靖县| 康定县| 延津县| 福海县| 连州市| 驻马店市| 宝坻区| 射洪县| 阳朔县| 南平市| 剑河县| 江永县| 开远市| 阿拉尔市| 柳江县| 维西| 新宁县| 永新县| 赤城县| 奉新县| 东莞市| 日土县| 邮箱| 固始县| 扬州市| 成武县| 陆丰市| 禹城市| 汶上县| 连城县| 铁岭市| 罗源县| 北辰区| 宣威市| 营山县| 吉水县| 洛扎县| 池州市| 西昌市|