2012-09-21 33 views
1

我試圖使用正在由在IIS中使用exec()運行的PHP調用的bat文件重新啓動Apache2.2 Web服務器,Apache和IIS位於同一臺服務器中。在IIS中使用PHP重新啓動Apache

PHP代碼

exec("cmd /c restart.bat");

bat文件

"PATH_TO_APACHE\bin\httpd.exe" -k restart -n Apache2.2

當我通過HTTP負載我的PHP重新啓動,我得到一個 「無法打開日誌」 在我的Apache的錯誤錯誤日誌文件。

我的搜索結果大部分都說80端口有衝突,但是當我做一個netstat的時候沒有,我的IIS正在監聽另一個端口。雙擊.bat文件,但從PHP運行會得到錯誤。有任何想法嗎?請指教。

+1

可能是因爲蝙蝠然後在IUSR下運行? – Passerby

+0

我已經添加了cmd.exe的權限,但是我得到了同樣的錯誤,在安全選項卡中添加了NETWORK SERVICE和IUSR –

+0

不確定這是否有幫助,但我曾經啓動了後臺進程('start/B php中的longtimejob.php'),並且使用'exec','system','passthru'不成功。最後我用'pclose(popen(「work.bat」,「r」))'工作。所以也許你可以試試'popen'和'proc_open'。 – Passerby

回答

0

IIS在指定用戶的上下文下運行所有​​可執行腳本,通常這是IUSR_ [MACHINENAME]帳戶。 可以在池配置中的IIS配置中更改此帳戶。

您遇到的問題可能是該用戶不允許訪問日誌文件位置。

要跟蹤這個問題,我會: 1.(危險的,只能用於測試):將IUSR帳戶放在本地管理員組中。再次測試。如果它有效,你知道這是一個許可問題。 2.嘗試使用runas命令作爲IUSR用戶運行cmd.exe,並在控制檯窗口中執行命令,這樣您可以更輕鬆地看到所有錯誤消息並進行測試。 3.允許IUSR寫入apache日誌位置。

完全不同的嘗試是在PHP中創建標記文件,並使用以管理員身份運行的計劃任務,以便在該標記文件存在的情況下重新啓動Apache。這樣你就不需要給予IUSR賬戶更多的權限,並且有一個單獨的代碼來處理重新啓動。

+0

謝謝你,你給了我這個想法,我去檢查IIS中的應用程序池設置,並將NetworkService更改爲LocalSystem,並且它工作正常。 –