2014-01-13 52 views
0

我想用PHP創建一個瀏覽器啓動的自調用/重複PHP腳本(當前是5.3.24,但很快會是最新的)。它將作爲一個守護進程監視數據庫中的更改(每隔幾秒鐘,因此cron/schedule已停止),然後在發現更改時調用其他PHP腳本執行工作。爲了這個問題的目的,請忽略這樣一個事實,即我最好在C#或其他語言中這樣做:)Windows PHP通過popen重複腳本

爲了保持簡單,我開始嘗試使用popen運行第二個PHP腳本背景...

// BatchMonitor.php 
SaveToMonitorTable(1); // save 1st test entry to see if the script reached this point 

$Command = '"" "C:\Program Files (x86)\PHP\v5.3\php.exe" C:\inetpub\wwwroot\Test.php --Instance=' . $Data->Instance; 

pclose(popen("start /B $Command", "r")); 
SaveToMonitorTable(2); // save 2nd test entry to see if the script reached this point 
exit(); 


// Test.php 
SaveToTestTable(1); 
Sleep(10); 
SaveToTestTable(2); 
exit(); 

如果我在瀏覽器中運行BatchMonitor.php它工作正常。正如預期的那樣,它會將1保存到監視器表中,調用Test.php將1保存到測試表中,原始BatchMonitor.php將繼續而不等待響應,並在退出前將2保存到監視器表中,然後10秒鐘後測試頁在退出之前將2保存到測試表中。第二個腳本啓動正常,第一個腳本不會等待回覆,並且所有參數都在腳本之間正確傳遞。隨着一切工作按計劃我然後通過調用本身(有延遲),而不是另一個腳本改變了系統的重複循環工作...

// BatchMonitor.php 
SaveToMonitorTable(1); // save 1st test entry to see if the script reached this point 

$Command = '"" "C:\Program Files (x86)\PHP\v5.3\php.exe" C:\inetpub\wwwroot\BatchMonitor.php --Instance=' . $Data->Instance; 

pclose(popen("start /B $Command", "r")); 
SaveToMonitorTable(2); // save 2nd test entry to see if the script reached this point 
exit(); 

如果我在瀏覽器中運行BatchMonitor.php它運行一次,這就對了。它會將1保存到數據庫中,等待10秒鐘,然後在退出之前將2保存到數據庫。該頁面成功返回,沒有腳本或PHP錯誤,但不會重複,因爲它應該。

BatchMonitor.php和Test.php都使用換行符相同的函數來獲取參數,並且這兩個文件在第一次迭代中運行正確且相同。如果我使用exec而不是popen,那麼頁面會正確地循環,所有邏輯按預期工作(有一個明顯的缺陷,即創建永不停止的腳本鏈,等待響應值永遠不會到來)。

我錯過了一些明顯的東西嗎? popen是否有某種可以防止頁面/進程打開自身重複的祕密規則?有沒有其他方法可以使用popen或exec?我閱讀了關於WScript.Shell的內容,但是可能需要一段時間才能安排啓用,所以現在它不是一種選擇,我希望有更多的標準可以使用。

+0

你有沒有試過記錄什麼popen返回?或pclose?我還建議你檢查一下你的命令文件路徑是否正確。 BackMonitor和Test.php的權限完全相同 – Dan

+0

popen返回「Resource id#1」並且pclose返回0.這與我調用Test.php時相同,並且工作正常。 PHP和腳本的文件路徑都經過驗證,權限相同。 –

回答

0

我不覺得這應該是你的實際答案,但你爲什麼要解散計劃任務/ cronjobs,因爲你想每X秒完成一件事情?讓腳本minute.php調用5seconds.php與betweencouse之間的5秒間隔會創建一個重複的扯掉5秒的權利? 奇怪的是,你已經有點從瀏覽器中使用相同的機制了。 我唯一需要考慮的是處理時間,並創建一個安全的腳本,以確保在任何給定時間不會超過1'5seconds.php'。

+0

我以前見過這個答案,因爲它會起作用我正在考慮它。 這個或類似外部C#應用程序的主要缺點是它需要對服務器進行較低級別的訪問。這對我來說不是問題,但它可能會在未來爲其他開發者帶來複雜的問題。 即使我走這條路線,我仍然想知道爲什麼這不僅僅是爲了知識而起作用。 –