2012-02-04 32 views
0

我正在尋找一些想法來完成以下工作。我需要一個PHP腳本來執行相當長的時間。這是一個CMS的擴展,這不能只是PHP。它也不能成爲一個命令行腳本,因爲它應該被普通人使用,只有CMS的標準手段。其中一個選擇是做一個cron工作(大多數簡單的主機都有),它會經常觸發腳本,以便長時間工作而不是長時間工作,可以一步一步地執行操作,從一次啓動到下一次啓動都保持其狀態。這並不完美,但我看不到任何其他解決方案。如果腳本將重定向到自己,服務器將會中斷它。還有什麼其他選擇可以滿永久生效的PHP腳本:)

謝謝大家提前!

+1

對,我們不希望你提前致謝,我們希望你在此事後感謝;) – andrewtweber 2012-02-04 17:30:02

+0

PHP中的功能不會在夜間被刪除。在您的腳本執行之前,您的CMS(取決於複雜性)很可能會因PHP升級而中斷。 – kba 2012-02-04 17:33:42

回答

2

你在說什麼是守護進程或長時間運行的程序,它等待客戶端程序調用,執行和操作,提供響應,然後繼續等待更多的調用。

您可能熟悉這些以Apache & MySQL的形式;)無論如何,PHP在這方面通常是可以的,它有能力通過原始套接字以及fork子流程來處理多個請求同時。

說了PHP守護進程是YMMV的工具。有些人會說他們工作得很好,像我這樣的其他人會說他們在進程間通信和內存泄漏方面存在問題,即使在過多的unset()調用中也是如此。

無論如何,您可能無法在共享主機環境中部署任何類型的守護進程。您需要獲得更好的服務器軟件包或堅持使用基於Cron的解決方案。

Here's a link關於編寫PHP守護進程。

另外,還有一個注意事項。守護進程不時崩潰,因此您可能仍需要存儲關於發生了什麼的狀態,以防萬一有人通過電源線跳到您的共享服務器:)

+0

謝謝。這是一個不錯的選擇,但由於它將成爲廣泛分佈式軟件的一部分,大多數人將無法以php守護進程的形式啓動腳本 – AndreyM 2012-02-04 18:48:12

+0

好吧,這很好,但這基本上是一個永遠運行的程序。如果你想分佈廣泛,那麼如果Windows是一個理想的平臺,你甚至可以將cron從列表中刪除。有一些技巧來模擬Apache內的長時間運行的程序[看這裏](http://moxune.com/blog/2011/04/non-blocking-web-service-processing-in-php/),但它們是最好留給短節目。任何在* nix系統上擁有root權限的人都可以運行/安裝守護進程。如果共享主機系統是軟件的目標,那麼cron很可能是一條可行的路。 – quickshiftin 2012-02-04 18:59:00

+0

是的,我知道一個守護進程是什麼,這將是一個非常好的選擇,除非只有那些只能下載擴展並使用CMS的標準方式進行安裝的人(選擇擴展文件並按「安裝」)。 – AndreyM 2012-02-04 19:28:04

1

我還建議您考慮製作它一個守護進程,但如果沒有,那麼你可以簡單地使用

set_time_limit(0); 
ignore_user_abort(true); 

在頂部告訴它不要超時,不要讓被任何中斷。然後從cron中調用它來每天或任何地方啓動它。我在許多長時間處理日常任務上都有這個功能,對我來說它非常有用。但是,它無法輕鬆地與外部世界交流(其他腳本無法查詢它或任何其他腳本 - 如果這是您想要查看php服務的內容),那麼一旦它啓動,請確保它停止並且讓它將進度打印到日誌文件中。

+0

我也有這個想法,但我想知道託管服務提供商是否監視他們的服務器以發現並中斷這些腳本。另外我想知道是否有託管提供商禁用更改您提到的選項的功能的方法。 – AndreyM 2012-02-04 19:15:35