2011-10-01 68 views
0

我正在嘗試創建一個允許我啓動和停止PHP腳本的網頁。該腳本是站點後端的一部分,需要訪問,讀取數據,處理數據以及更新腳本所在服務器上的數據庫。此外,我希望網頁允許管理員查看當前狀態(正在運行或已停止),甚至鏈接到由腳本創建的日誌。 我開始走下去學習PHP的exec,passthru和相關函數的路徑。這是正確的道路嗎?還有其他方法可以做到這一點嗎?是否有可能以平臺不可知的方式做到這一點?我正在開發Windows中的LAMPP + CakePHP堆棧,並希望在我選擇的任何虛擬主機上存在這些功能。從後端管理頁面啓動和停止PHP腳本

+0

您想運行一個連續運行的腳本嗎?或者你想避免他的開始?你在標籤列表中提到守護進程是否是這種你想創建的東西? –

+0

我想創建一個可以持續運行的腳本(或者直到我停下來)。我希望能夠通過點擊網站上的網頁上的按鈕來啓動和停止該腳本。我想堅持HTML,PHP和Javascript(如有必要),我想創建一個平臺不可知的解決方案。 – reggie3

回答

3

我在最近的工作中已經完成了這項工作,但這對您來說可能是矯枉過正。我做了一個作業處理器,它基本上在數據庫中設置了2個表格,最少2個控制器,最少2個控制器。

第一部分是作業處理單元,它由作業處理器控制器組成,它負責管理啓動或繼續作業的請求,並附帶兩個activerow模型JobQueue和Job。你可以刪除這個隊列,但是在這樣的系統中排隊是非常實用的,所以你可以說2,3,4個任務可以一次執行。

這個隊列只是它的一個插槽,它連接了幾個作業,它有一個隊列狀態來確定它是否正在運行。

作業是一個虛擬對象,映射到描述必須完成的作業表。在我的實現中,我創建了一個必須在被調用的控制器中實現的接口和一個字段+數據庫中的一個類型。 Job實例調用控制器類來調用(而不是作業處理器控制器,另一個控制器來管理操作),並調用其中的方法來啓動任務處理。

現在,變得棘手,我強迫我的系統在專用服務器上運行,因爲我不希望任務加載主服務器或堵塞Apache的處理隊列。所以我有兩臺服務器,我的Queue類負責通過一個IP地址調用另一臺服務器上的一個頁面來專門在該服務器上運行作業。作業完成後,它會使用HTTP請求重新啓動處理並執行下一個任務。如果沒有任何工作,那麼它就會正常死亡。

這樣做的好處是它不需要cronjob(只要你的腳本超穩定並且不會崩潰),因爲它在你想要的時候被你觸發,然後你可以放手並用fsockopen調用自己以觸發另一個觸發下一個作業的頁面視圖。

工作單位

明白,如果你的工作是非常大的,你應該分割他們是很重要的。我使用「工作單位」的原則來描述工作必須進行多次的1個部分。那麼隊列處理器成爲了經理的時間也讓他能夠檢測一個工作比X秒花了,它只會推遲後的剩下的步驟並調用自身回來,繼續進行他的。這樣,您不需要「設置時間限制」,並且在30秒的腳本執行時不會阻塞服務器。

我希望這有助於!

+0

感謝您的回答。這聽起來像我正在做的事情的矯枉過正。我只想執行以下操作:每24小時根據某些條件從我的數據庫中選擇一些行數,更新數據庫中每行的字段,然後在24小時內再次重複。我認爲最好的辦法是在服務器上連續運行腳本。最後,我希望能夠使用管理員可訪問的網頁上的兩個按鈕啓動該腳本,另外,我希望網頁顯示腳本的狀態(正在運行/已停止)。 – reggie3

+0

你最好的選擇是依靠具有cron功能的服務器。每個CPANEL像服務器都有CRON命令,它允許您運行CLI腳本或使用一點wget --remove-after URL讓您像腳本一樣調用腳本。你也可以使用外部cron,比如http://webcron.org/在你的網站上觸發一個腳本,我「認爲」它是免費的,我從來沒有用過它們...... –

0

要運行的持續運行腳本,你需要考慮到:

  • 你的PHP腳本應該由作業調度比如cron或者其他什麼東西被推出,CLI(命令行)。不要忘記,您的Web服務器配置定義了執行腳本的超時。

  • 要每天運行24小時,也許您想象實現無限循環。在這種情況下,您可以編寫一個像jobIsActive這樣的測試,如果應該執行作業,它可以在每個循環中讀入文件或數據庫中。如果你點擊按鈕,只需更改作業狀態(更新文件,db ...)。你的兩個按鈕可以停止治療或激活它,但不會停止無限循環。

  • 無限循環並不是最優雅的解決方案,爲什麼不在cron選項卡中編寫條目以便每晚執行作業,並且單擊按鈕可以手動觸發它。