php 守護程序 (簡單)
阿新 • • 發佈:2018-12-11
首先需要解釋的是什麼是守護程序。
守護程序就是在後臺一直執行的程序。比如我們啟動的httpd,mysqld等程序都是常駐記憶體內執行的程式。
針對需求進行分析:
需求:有一個常駐佇列messageQueue(假設在redis記憶體中),這個佇列會有可能有請求不定期的往佇列中增加元素。同時我們要求在佇列中有元素的時候,按照佇列順序將元素pop出來,並進行處理(假設這個處理只是echo ‘test’);
解決方法:
現在假設已經有了兩個函式
function oPopMessageQueue(){ …} //獲取佇列最後一個元素;
function vDealElement($element) { …} 處理元素;
要求寫出一個守護程式,完成上面的需求。
程式:
好了,這個程式很容易想到,可以使用while迴圈來做
while(true) { if( $element = oPopMessageQueue()) { vDealElement($element); } }
考慮1 : 這個程式如果一直跑的話已經可以滿足上面的需求了.
但是考慮到:1 用php程序跑有可能會由於各種情況(比如執行時間過長),程序掛了,這樣程式就無法自動重連了.
方法:使用cron
我們在定時指令碼中每10分鐘起一個程序跑這個程式。
然後設定這個程式的執行時間為10分鐘,10分鐘後自動取消,於是程式碼變成
while(true) { if($element = oPopMessageQueue()) { vCheckTimeLimit(); vDealElement($elemnt); } } $timeStart = 0; function vCheckTimeLimit() { global $timeStart; if(empty($timeStart)) { $timeStart = time(); } if(time() - $timeStart > 60考慮2,可能會有這種需求: 需要有隨時讓指令碼暫停的功能: 於是考慮使用檔案來增加暫停功能*10) { exit; } }
while(true) { if($element = oPopMessageQueue()) { vCheckTimeLimit(); vCheckEnd(); vDealElement($elemnt); } } function vCheckEnd() { if(file_exists("/home/JesephYe/end")) { exit; } }
考慮3, 是否可以改成多執行緒的程式,讓執行的效率更高?
這個只要把cron的10分鐘起一個程序的限制改成每1分鐘起一個程序就好了
這樣能保證有10個執行緒在執行程式
但是有一個基本要求是:oPopMessageQueue()是一個原子操作