[Apache] PHP 啟動成功,但是吃不到 php.ini 的設定 ( Windows 環境)

在 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 安裝有關的設定指令只有兩行

PHPIniDir "C:\xxxxx\PHP\"
LoadModule php5_module "C:\xxxxx\PHP\php5apache2_4.dll"
 

然後我在正常運作的撰寫環境做了測試,想要測出異常的環境情況

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 檔案剛好是舊備份,所以沒有記錄到之後調動的環境變數(結案)