在 Windows 環境下,Apache 及 PHP 啟動成功 ( php 檔案可執行),但是 phpinfo() 中的資料卻不是 php.ini 的設定,
可能是因為沒有設定系統的環境變數 PHPRC,若沒設定 PHPRC 就要靠 httpd.conf 中的 PHPiniDir 參數指定 PHP 安裝目錄路徑,並且確保 PHPiniDir 設定的路徑中使用的是正斜線/ (從右到左的斜線)。
/* 2013.5.28 Maple 撰寫
2013.5.29 Maple 修改 */
環境:Windows server 2008 + Apache 2.4.3 + PHP 5.3.20
發生的情況是一台完全正常運作的環境,ghost 整個系統後,安裝到第二台當備援主機,
結果第二台的系統啟動正常,但網頁一片空白。
因為 MIS 搞不定,所以我就接過來找問題.....
網頁空白當然馬上直覺是 PHP 錯誤,查了 log 資料夾卻沒有 php error 檔案 (!?)
然後開始 PHP 除錯 + 心裡暗罵OOXX (因為要找好幾層) ,發現了幾個詭異的狀況
1. session_start() 有成功,但是指定儲存 session 的資料夾中卻沒有檔案
2. 終於印出錯誤訊息 Fatal error: Call to undefined function mysql_connect() ,但檢查 php.ini 確定有設定載入 mysql ,dll 檔案也存在
印出 phpinfo() 只有 mysqlnd 函式庫 ,卻沒有 mysql,而 error_log 設定值為空值
(我知道 mysql 函式庫要廢掉了~不過程式寫的很差...嗯...打算死期到了的時候再醫...)
Apache 到底吃到哪一個 php 設定檔了 !?
httpd.conf 跟 php 安裝有關的設定指令只有兩行
然後我在正常運作的撰寫環境做了測試,想要測出異常的環境情況
1. 把 php.ini 刪掉,完全沒有 .ini 設定檔 => 重新啟動 Apache phpinfo() 可執行 (震驚,怎麼能跑 php ?)
2. 把 PHPIniDir "C:\xxxxx\PHP\" 註解起來 => 重新啟動 Apache phpinfo() 可執行 (再次震驚,這個也是不必要的嗎?)
3. 把 LoadModule php5_module "C:\xxxxx\PHP\php5apache2_4.dll" 註解起來,PHP 果然沒啟動了 (不然我以為我改到錯的 httpd.conf )
而 1 跟 2 印出的 phpinfo() ,參數設定跟異常環境相同,只有 mysqlnd ,error_log 沒有設定值
大膽推論(我沒爬官方文件...),PHP 參數有預設值,沒有 php.ini 檔案也沒關係
但是為什麼有 php.ini , PHPIniDir "C:\xxxxx\PHP\" 會沒有作用?
雖然第一台的環境用相同的設定檔是正常,但想到我被斜線陰了幾次的經驗
(不知道為何 "不只一個人" 有文件參考可以copy,卻還是習慣自己手 key 參數值,導致調整完後 apache 無法啟動,讓我找到眼睛脫窗都找不到錯誤 ="=)
馬上改成正斜線 PHPIniDir "C:/xxxxx/PHP/" 重新啟動! 阿母~我出運了!抓到 php.ini 的設定了!
證明這次又是反斜線陰我,尤其是 N 台電腦都可以吃這個設定,就今天這台主機反骨....
( 而且被 ghost 前的環境是能正常跑相同參數值的 = =??? 莫非是 ghost 讓它的個性變了嗎? )
另外我想要證明反斜線不是我恍神打的 (第一台的設定檔是我調的) ,
雖然我每次也會搞不清楚要打正的還是反的,但是安裝 php 的執行檔會自動修改 httpd.conf 增加 php 參數
我一向秉持著原本打什麼斜線,調整設定時我就打相同的斜線,絕‧對‧不‧手‧賤 !
因此開啟了備份的 php.exe 安裝檔,重新讓它安裝 php
測試結果,的確是在自動安裝檔時添加的路徑為 反斜線\
以後要記得 PHP 的安裝檔執行完後,要檢查路徑為正斜線 /
(正斜線就是由右到左)
最後有個小插曲,
在寫這篇文章的時候,想把我正常的撰寫環境再弄成相同的異常環境,
把 PHPIniDir "C:/xxxxx/PHP/" 註解後 apache 重啟,居然還是有原本 php.ini 的設定 !?
我又再度傻眼了,到底是記憶體有暫存還是我的結論是錯的?
憤怒的重開機後,phpinfo() 中就抓不到 php.ini 的設定值了,呈現異常環境的狀態。
好險上面一整篇的 complain 文章沒白打。
(今天的運氣超不好)
/* 2013.5.29 補充 */
今天早上請前同事(美工)幫我查新版 wamp 的 httpd.conf 設定
在她的環境 wamp 是沒有 PHPiniDir 這個參數,卻能正確抓到 php.ini 裡設定值
想必事情不單純.....(沉思)
該不會是我 上一篇 說的環境變數吧(!)
馬上查了我的撰寫環境、正式環境 跟 備援環境(也就是異常的那台)
果然只有正式環境有設定系統環境變數...另外兩個都是沒設定的
所以我算是誤打誤撞的剛好用到兩台沒設環境變數的電腦找問題
PHPRC 這個環境變數對 PHP 的重要性,相當於 JAVA 的 JAVA_HOME 阿....
將 PHPRC 及 Path 修正正確後,在 httpd.conf 中沒有設定 PHPiniDir 也沒有關係了。
也證明 N 台電腦沒出事是因為有設 PHPRC 的關係,
ghost 檔案剛好是舊備份,所以沒有記錄到之後調動的環境變數(結案)