2013-07-14 264 views
1

我有一個通過REST API提供某種服務的網站。所有功能都具有常規的HTTP請求 - 響應邏輯。但另外我需要另一個PHP腳本來做一些連續的事情。一方面,這個腳本應該可以訪問所有的核心服務功能(核心引擎,存儲過程等)。另一方面,這個腳本應該保持與第三方服務的持久連接,並且不時地從中讀取一些信息。另外,這個腳本應該是容錯的,並且應該保證這個腳本只有一個實例在任何時候運行。還有一些原因讓我無法將這個任務放在Cron服務上,而不是運行無限的腳本。PHP服務(守護進程)

我現在最好的想法是編寫一個普通的PHP腳本,它以set_time_limit(0)開頭,並且包含我的東西動作和睡眠後的無限循環。該腳本將手動啓動。此外,我可以使用某種密碼來保護此腳本,以確保沒有其他人能夠運行它。你們對這個解決方案有什麼看法?這種解決方案是否會影響一些不想要的FastCGI副作用?我怎樣才能使這個解決方案容錯?我該如何停止這個腳本,或者檢查它是否正在運行?最後一件事:我怎樣才能通過HTTP請求運行這個腳本,這樣它就不會阻塞任何東西(有點像後臺運行的CURL或其他東西)。謝謝!

回答

2

首先,爲什麼不能使用crond呢?

我建議你通過crond啓動腳本一次,例如15分鐘。這樣,腳本最多可以在15分鐘內不可用,以防崩潰。爲了確保腳本只運行一次,您需要實現其他所有守護進程執行的操作 - PID文件 - 使用posix_getpid()。如果具有該PID的進程存在,則終止該腳本。如果不是,則先前的實例崩潰並且腳本應該再次運行。

甚至更​​好,爲此編寫一個Upstart script(如果你在Debian/Ubuntu上)。它隨後會在系統啓動時自動啓動,您可以隨時通過service script startservice script stop輕鬆將其關閉或重新啓動。您可以通過發行service script status來檢查狀態。

您將腳本放在任何htdocs目錄之外的服務器上。這樣它就不會暴露給網絡,並且不能通過HTTP請求啓動。您還可以使用php_sapi_name()檢查SAPI爲cli

爲什麼要通過HTTP運行該腳本?它是一個守護進程,所以它從系統啓動開始。

你也應該看看類似的問題:Run php script as daemon process

+0

嗯,我需要保持與第三方服務的持續連接,並且由於我無法在腳本實例之間傳遞連接的套接字,唯一的方法是連續腳本而不是Cron。我需要保持連接持久性,因爲我需要儘量減少對第三方服務的請求之間的延遲。如果我將使用Cron,那麼我將有額外的DNS解析和TCP連接延遲。即使DNS將被緩存,我也無法消除TCP連接延遲。而我的服務器是CentOS服務器。以某種方式影響你的建議? –

+0

該腳本實際上** IS **持久。 Crond僅用於啓動腳本並在腳本崩潰時重新啓動它(您使用的術語是「容錯」)。在腳本內部,你仍然有某種「無限循環」。是的,CentOS也使用Upstart。 – Shi

+0

考慮到你寫的所有內容後,我想我會嘗試製作Upstart腳本和看門狗Cron任務。感謝您的幫助,隊友! :) –