在沒有樣板代碼的情況下創建強大而穩定的PHP多進程守護程序。核心守護程序類處理主循環和事件,並且可以以任何所需的頻率運行(在PHP的範圍內) 。您只需要實現單個方法execute即可在後台運行守護程序進程。
使用任務和工人,守護程序可以在背景過程上調用方法無縫,而不必擔心管理分叉的孩子。插件允許您輕鬆為守護程序創建可重複使用的可共享代碼。有關更多信息,請參見下面的功能部分。
顯然,在PHP中寫下健壯,穩定且長期的守護程序通常不是一個好主意。至少很難做得很好。我個人需要PHP中的守護程序,因為我建立了整個網站框架,需要主要的後端守護程序。我希望能夠重複使用複制資源或配置的所有前端依賴關係和實體。
雖然該庫竭盡所能讓您創建一個岩石固體的守護程序,但仍必須在用戶地代碼中註意以保持穩定的情況。
請參閱Wiki以獲取文檔。
有關可以運行的示例,請參見示例目錄。
Main Loop由核心守護程序類維護。您所要做的就是實現一個可以被execute每個循環週期的方法。循環頻率可以是幾秒鐘內的任何分數值。如果設置為0,則您的execute方法將盡可能快地調用(通常不建議使用,除非您的循環進行某種阻止調用,即:在插座上聆聽等)。任務允許您在背景過程中調用任何方法或回調。背景過程與父母之間沒有進行通信。任務是針對簡單的事情,例如:發送電子郵件。
工人允許您調用對像上的任何方法,甚至像任務一樣簡單的回調。工人可以通過您的工作者方法中的簡單return語句將價值返回給父母。工人可以自動維護,並且可以同時讓多個孩子跑步,這是透明處理的。即使工人死亡或被操作系統殺死,守護程序API仍然會將結果(或例外)歸還給您的代碼。工人的返回值通常是Promise對象。您可以使用then標準承諾方法或otherwise對返回值行動。或者,您可以在工作人員上註冊一個ON_RETURN回調。
工人使用調解員設計模式,並使用共享內存進行消息隊列和數據。可以創建不同的IPC類以提供父母和子女之間的替代通信方法。我可能會選擇使用插座而不是SHM的第二個IPC類,以提供另一種選擇。
Daemon有幾個事件(請參閱:事件),您可以通過註冊回調來輕鬆地與之接口。有些事件有能力改變守護程序的行為。ON_SIGNAL回調即可。您的回調將通過帶有捕獲的信號SignalEvent通過。Plugin架構允許您使用並創建可以注入守護程序的插件。插件可以懶惰地加載。FileLock允許您添加鎖定機制,以防止守護程序一次運行多個實例。只需在守護程序中註冊插件,其餘的是自動的。 ShmLock相似,但使用共享內存來獲得鎖。Daemon有3種基本的記錄方法: log , error , debug 。所有這些都會寫入日誌文件(如果配置)。如果日誌文件被旋轉,覆蓋或刪除,守護程序將自動檢測到這一點,並將繼續寫入新的日誌文件。 Daemonevent :: ON_LOG事件允許您註冊回調以更改行為。用戶代碼可以使用日誌文字輕鬆地將本機守護程序記錄添加到其代碼中。該圖書館的基礎靈感來自Github上Shane Harter的PHP-Daemon庫。不幸的是,他的圖書館被遺棄(或在無限期的中斷)是為php v5.3編寫的,沒有名字領域,沒有包裝管理或自動加載器(即:作曲家)。
我選擇創建一個全新的圖書館,而不是為了教育目的而分叉和修改其原始圖書館。我也不同意他的一些方法。我確實需要一些額外的依賴性,但是作曲家使這是一個瑣碎的問題。
_這個圖書館處於完全工作狀態。我創建了非常複雜的守護程序,這些守護程序已經運行了幾個月,沒有任何內存洩漏或崩潰。可以做更多...