因項目須要, 構建了不少消息隊列還排隊處理任務, 相應的每一個隊列也配有一個feed程序來feed消息this
一開始很簡單地這樣作:spa
while (true){ $msg = $query->bPop(); //消息處理程序 }
這種方式下feed程序一開始運行就永遠不會退出, 乍看沒有問題, 但存在一個問題, 一旦消息處理程序發生變化, 若是不手動kill進程後重啓進程, 改動就不會被加載.code
另: 聽說PHP進程運行太久就會產生垃圾難以回收, 須要終止進程來回收進程垃圾.blog
因此我講feed程序都改爲如下方式:生命週期
set_time_limit ( 0 ); $startTime = time (); $maxDealNum = 1000; // 最大處理次數 $maxLifeTime = 12 * 3600; // 最大生命週期時長 $dealedNum = 0; while ( true ) { $this->load->model ( 'item/category_frequently' )->bDealMsg (); $dealedNum ++; //超過最大處理次數或處理時長時程序退出, 以守護進程從新啓動的方式清理內存垃圾 if ($dealedNum > $maxDealNum || (time () - $startTime) > $maxLifeTime) { return; } }
每處理完一個消息後計數, 以及記錄feed程序開始執行時間, 若是2者都超過某一個闕值就讓程序退出, 這樣能夠避免單一的長時間飢餓或執行頻繁情景下進程不會退出. 而消息處理程序發生改變的時候也能夠在可預期時間內被從新加載隊列