最近研究workerman原始碼,學習了定時器部分,從裡面抄了乙個定時器出來,單獨出來,有利於理解定時器原理。
下面是**,呼叫方式跟workerman一樣,都是新增定時事件進去,可以使延時呼叫一次,也可以是定時呼叫,間隔一段事件就執行一次。測試執行,在命令列裡面,執行php timer.php即可。
可以在win下執行,不依賴其他擴充套件,直接裝上php就可以執行,不過生產環境,還是建議部署在linux上,此定時器,加上守護程序,就可以做一些定時任務,支援毫秒定時,不過可能會有1毫秒的誤差,相比linux的crontab機制,可以更精確定時。
相關的原理:
1、基於stream_select的超時機制
2、基於時間堆(最小堆)
3、使用了php的spl裡面的優先佇列,splpriorityqueue
時間堆實現定時器
時間堆 將所有定時器中超時最小的乙個作為心搏間隔,這樣,一旦心搏函式tick被呼叫,超時時間最小的乙個定時器必然到期,我們就可以在tick函式裡處理該定時器,這樣就實現了較為精確的定時 最小堆很適合這種方案,最小堆的堆頂永遠為最小的元素,這樣每次只要將堆頂的定時器處理,並將下乙個堆頂元素的超時時間作...
php實現毫秒定時器,基於event擴充套件實現
最近學習workerman框架,由於windows上也可以安裝event擴充套件,所以下面的 也支援在win上執行,是參考workerman原始碼的 class timer else this eventbase new class name see eventinte ce add public ...
c實現毫秒 微秒級定時器
秒級定時器,都知道可以用sleep實現,但如果要實現毫秒級呢?usleep?使用select實現 select函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout...