我想用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的內容,但是可能需要一段時間才能安排啓用,所以現在它不是一種選擇,我希望有更多的標準可以使用。
你有沒有試過記錄什麼popen返回?或pclose?我還建議你檢查一下你的命令文件路徑是否正確。 BackMonitor和Test.php的權限完全相同 – Dan
popen返回「Resource id#1」並且pclose返回0.這與我調用Test.php時相同,並且工作正常。 PHP和腳本的文件路徑都經過驗證,權限相同。 –