這篇文章給大家介紹如何分析Swoole中定時(shí)器的使用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
作為一家“創(chuàng)意+整合+營(yíng)銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們?cè)跇I(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)公司提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)站制作、創(chuàng)意表現(xiàn)、網(wǎng)頁(yè)制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營(yíng)銷運(yùn)營(yíng)等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營(yíng)模式與有效的網(wǎng)絡(luò)營(yíng)銷方法,創(chuàng)造更大的價(jià)值。
先說(shuō)說(shuō)原生PHP如何實(shí)現(xiàn)定時(shí)器,PHP的定時(shí)器是通過(guò)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)的處理器。
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í)器可以達(dá)到毫秒精度,同時(shí)可以支持添加大量定時(shí)器。
在Swoole中可以使用 Timer::tick 來(lái)設(shè)置一個(gè)間隔時(shí)鐘定時(shí)器,調(diào)用Timer::clear來(lái)清除定時(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,
觸發(fā) onMessage 回調(diào)后在客戶端打印出如下信息,截圖
除此之外swoole還提供了另外一個(gè)函數(shù) Timer::after 來(lái)實(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ì)銷毀。示例代碼如下:
除了設(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來(lái)刪除定時(shí)器
bool Timer::clearAll();//清除當(dāng)前工作進(jìn)程內(nèi)的所有定時(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í)間過(guò)長(zhǎng),甚至覆蓋了下一次定時(shí)器執(zhí)行的時(shí)間。底層會(huì)進(jìn)行時(shí)間校正,丟棄已過(guò)期的行為,在下一時(shí)間回調(diào)。關(guān)于如何分析Swoole中定時(shí)器的使用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。