溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何分析Swoole中定時(shí)器的使用

發(fā)布時(shí)間:2022-01-15 13:35:46 來源:億速云 閱讀:116 作者:柒染 欄目:大數(shù)據(jù)

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

一、PHP本身的定時(shí)器介紹

先說說原生PHP如何實(shí)現(xiàn)定時(shí)器,PHP的定時(shí)器是通過pcntl_alarm實(shí)現(xiàn)的:

pcntl_alarm ( int $seconds ) : int

pcntl_alarm 函數(shù)的作用是為進(jìn)程設(shè)置一個(gè)alarm鬧鐘信號(hào)。調(diào)用這個(gè)方法后會(huì)創(chuàng)建一個(gè)計(jì)數(shù)器,在指定的秒數(shù)后向進(jìn)程發(fā)送一個(gè)SIGALRM信號(hào)。每次對(duì) pcntl_alarm 的調(diào)用都會(huì)取消之前設(shè)置的alarm信號(hào)。

其中,$seconds 為等待的秒數(shù),如果 $seconds 設(shè)置為0,將不會(huì)創(chuàng)建alarm信號(hào)。調(diào)用這個(gè)函數(shù)后返回上次alarm調(diào)度剩余的秒數(shù),或者之前沒有alarm調(diào)度時(shí)返回0。

下面我們看一個(gè)例子,pcntl_signal() 函數(shù)安裝信號(hào)處理器,pcntl_signal_dispatch() 調(diào)用等待信號(hào)的處理器。

如何分析Swoole中定時(shí)器的使用

pcntl_alarm() 函數(shù)是基于時(shí)鐘信號(hào) + tick函數(shù)實(shí)現(xiàn)的,存在一些缺陷:

最大進(jìn)支持到秒,而Swoole Timer可以到毫秒級(jí)別

不支持同時(shí)設(shè)定多個(gè)定時(shí)器程序

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

二、Swoole中定時(shí)器的使用方法

Swoole中的定時(shí)器可以達(dá)到毫秒精度,同時(shí)可以支持添加大量定時(shí)器。

在Swoole中可以使用 Timer::tick 來設(shè)置一個(gè)間隔時(shí)鐘定時(shí)器,調(diào)用Timer::clear來清除定時(shí)器。函數(shù)定義如下:

int Swoole\Timer::tick(int $msec, callable $callback, ……$params);

這個(gè)函數(shù)的別名是 swoole_timer_tick()。$msec 為指定的時(shí)間,單位是毫秒。$callback 為時(shí)間到期后執(zhí)行的函數(shù)。$callback 回調(diào)函數(shù)會(huì)接收多個(gè)參數(shù),第一個(gè)是定時(shí)器的ID。注意:定時(shí)器僅在當(dāng)前進(jìn)程空間內(nèi)有效。定時(shí)器是純異步實(shí)現(xiàn)的,不能與阻塞IO的函數(shù)一起使用,否則定時(shí)器的執(zhí)行時(shí)間會(huì)發(fā)生錯(cuò)亂。

下面是定時(shí)器在 websocket 的 onMessage 回調(diào)函數(shù)中的一個(gè) demo,

如何分析Swoole中定時(shí)器的使用

觸發(fā) onMessage 回調(diào)后在客戶端打印出如下信息,截圖

如何分析Swoole中定時(shí)器的使用

除此之外swoole還提供了另外一個(gè)函數(shù) Timer::after 來實(shí)現(xiàn)定時(shí)器,這個(gè)函數(shù)是的作用是在指定時(shí)間后執(zhí)行回調(diào)函數(shù)。函數(shù)原型如下:

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

這個(gè)函數(shù)的別名是 swoole_timer_after。Timer::after是一個(gè)一次性定時(shí)器,執(zhí)行完成后就會(huì)銷毀。示例代碼如下:

如何分析Swoole中定時(shí)器的使用

除了設(shè)置定時(shí)器的函數(shù)外,Swoole還提供了另外幾個(gè)函數(shù):

function Timer::set(array $array); //設(shè)置定時(shí)器的參數(shù)

Timer\Iterator Timer::list();//返回定時(shí)器迭代器, 可使用foreach遍歷全局所有timer的id

array Timer::info(int $id);//返回timer的信息

bool Swoole\Timer::clear(int $timer_id);//使用定時(shí)器ID來刪除定時(shí)器

bool Timer::clearAll();//清除當(dāng)前工作進(jìn)程內(nèi)的所有定時(shí)器

三、Swoole定時(shí)器的底層原理

Swoole定時(shí)器底層是基于epoll_wait 和 setitimer 實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu)使用的是最小堆。

Swoole定時(shí)器回調(diào)函數(shù)的執(zhí)行時(shí)間不影響下一次定時(shí)器執(zhí)行的時(shí)間。如果定時(shí)器回調(diào)函數(shù)的執(zhí)行時(shí)間過長(zhǎng),甚至覆蓋了下一次定時(shí)器執(zhí)行的時(shí)間。底層會(huì)進(jìn)行時(shí)間校正,丟棄已過期的行為,在下一時(shí)間回調(diào)。關(guān)于如何分析Swoole中定時(shí)器的使用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI