故障現象:
在 Windows Server 2003+IIS6.0 環境下,原先配置好的 PHP5.0.4 可以正常工作。但在同一台機器上,Apache2.2.8+PHP5.2.5下正常啟動並執行代碼,在 IIS 下不能正確執行 exec() 函數。比如,exec(’cd’,$arr,$ret) 語句,其執行結果,$arr 數組的值應該是包含該語句的 php 檔案做在的 Windows 路徑,但結果卻是“C:/Windows”檔案夾。並且不能正確執行其他外部 exe 程式。
診斷:
IIS 配置裡,已經開放 isapi 擴充允許。
Windows/system32/cmd.exe 已經加過 IUSR_… 賬戶許可權。
要執行的外部 exe 程式,已經拷貝到 Windows/system32 檔案夾下,也已經加過 IUSR_… 賬戶許可權。
網站所在的檔案夾,已經賦予 IUSR_… 賬戶許可權。
懷疑是 PHP 版本過低,或哪裡許可權不夠導致該問題。
(1)升級 PHP5.0.4 到 5.2.5
Windows 的全域 Path 變數配置指向 PHP5.2.5 檔案夾。PHP5.2.5 的 php.ini 檔案拷貝到 Windows 檔案夾下。網站的 .php 映射指向到 PHP5.2.5 檔案夾下的 php5isapi.dll。重啟 IIS 後,開啟網站,彈出一個提示框,提示需要輸入使用者名稱和密碼,輸入 Windows 的 Administrator 賬戶和密碼後,仍不能開啟網站。
這時想到,給網站所在檔案夾加上 User 賬戶的讀取和執行許可權試一下。執行該操作後,不再彈出要求賬戶和密碼的對話方塊,可以開啟網站的下級頁面(這一步至關重要)。但不能開啟首頁,可能是因為首頁調用了資料庫連接的原因。這時能開啟測試 exec() 函數的 php 頁面,結果仍然不正確。
這時懷疑是已經起作用的 PHP5.0.4 的檔案和 5.2.5 相衝突。果然,在 Windows/system32 檔案夾下發現原 5.0.4 的所有 .DLL 檔案,包括 PHP5.0.4 檔案夾下和 PHP5.0.4/ext 下的 .DLL 檔案,都被拷貝到了這裡!(注意,這不是必須的,是聽信某些“教程”的教唆而這麼做的。但既然拷貝到了這裡,可能已經其作用了。)於是,把 IIS 和 Apache 服務關閉,把 PHP5.2.5 的所有 dll 檔案也拷貝到這裡(入鄉隨俗、如法炮製)。再啟動機器–啟動機器是因為讓 Windows 重新載入最新的 .DLL 檔案。這時,PHP 因該是全套升級到了 5.2.5 版本了。
啟動機器後,報錯“No input file specified”,看來有門,因為錯誤資訊已經變化了,說明前述的配置在生效了。在網上搜尋產生該錯誤資訊的原因,提示“在 IIS 的 ISAPI 模式下出現‘No input file specified’資訊,只要把 php.ini 裡的 doc_root = ……注釋掉就可以了”,照此提示,在 php.ini 裡的 doc_root = …… 語句前加個分號,注釋掉語句,再重新啟動 IIS。全好了!
注意, doc_root = …… 語句在 php.ini 裡一般是“doc_root =”,就是值是空的。但因為我的 php.ini 檔案是從與 Apache 配合的 PHP 檔案夾拷貝過來的,可能在安裝 Apache 時,Apache 賦了一個值。其實把該值設為空白的,應該和和注釋掉的效果相同。這裡不是關鍵的地方,僅僅是一個小插曲而已。
結論:
問題解決了。但不能確定是因為給網站所在檔案夾加上了 User 賬戶的許可權,還是因為升級 PHP,而導致問題的解決的。總之,肯定是上述2個操作的某一把問題解決了,但不能確定是哪一個?應該不是因為2個操作同時起作用的吧,感覺不是,沒有理由。
還有一個收穫,就是,Windows 很多問題是因為許可權配置引起的,所以,告誡那些外行系統管理員,請不要隨便加上或去除檔案夾的的許可權,從而引起系統的安全性降低和意外故障。再注意,配置系統也要做好記錄,並及時測試該配置結果對系統的影響,不要哪天發現系統不對勁,還不知道是哪個配置引起的。
張慶(網眼) 2009-7-3
來自“網眼視界”:http://blog.why100000.com
“十萬個為什麼”電腦學習網:http://www.why100000.com