PHP 設定方法比較
阿恆
設定 PHP 有很多方法,最正式的可以使用 php.ini,但它會影響伺服器內所有 PHP 程式,最靈活的是 ini_set(),可惜不是所有東西都可以用它來設定。還有其他方法嗎?甚麼時候用甚麼方法最妥當?本文比較了 6 種不同的 PHP 設定方法。
1. php.ini
這個方法適用於所有 PHP 版本,在任何運作環境都可以使用,可更改的 directive 類別包括 PHP_INI_ALL、PHP_INI_USER、PHP_INI_PERDIR 和 PHP_INI_SYSTEM。
這是 PHP 的正式設定檔,設定的內容會影響伺服器內所有網站。所以若果有些設定,例如有關系統安全,或者屬於公司 IT 政策要求的設定,需要強加於所有網站上,放在 php.ini 是最合適的。
由於 php.ini 的內容影響伺服器內所有網站,在網頁寄存伺服器上,這個檔案通常只有系統管理員才可修改。
若果 PHP 以 Apache module 的形式運作,更改 php.ini 後需要重新啟動 Apache。
若果 PHP 以 CGI 或命令行 (CLI) 方式運作,每次執行 PHP 程式時都會重新讀入 php.ini。
2. httpd.conf
這個方法適用於所有 PHP 版本,PHP 必須以 Apache module 的模式運作,可更改的 directive 類別包括 PHP_INI_ALL、PHP_INI_PERDIR 和 PHP_INI_SYSTEM。
一般甚少人會在 httpd.conf 內設定 PHP,只有當你沒有修改 php.ini 的權限,但卻要修改 PHP_INI_SYSTEM 類別的設定,才會動 httpd.conf 的腦筋。
修改 php.ini 才是正當的方法,這樣所有 PHP 相關的設定可以集中在一個地方,也可以把 Apache 和 PHP 的設定分隔開來,減低人為錯誤的機會,也方便指定不同的設定權限給不同的管理人員。
由於 PHP 的常數 (例如 E_ALL) 只有 PHP 能明白,這個由 Apache 讀取的檔案便不能包含 PHP 常數,只能使用對應的數值。
3. 本地 php.ini
這個方法適用於所有 PHP 版本,原理是透過 httpd.conf 的 PHPINIDir 指令 Apache 讀取本地目錄中的 php.ini,取代系統的 php.ini。其中一個常見的實作方法,是 PHP 以 Apache module 的模式運作,網站則以 Apache 的虛擬伺服器模式實作,在 httpd.conf 的虛擬伺服器分段中,設定 PHPINIDir 為網站的根目錄 (document_root),這樣網站便會以根目錄中的 php.ini 為設定檔。可更改的 directive 類別包括 PHP_INI_ALL、PHP_INI_USER、PHP_INI_PERDIR 和 PHP_INI_SYSTEM。
這不是 PHP 的官方指定方法,不過在寄存式的網站上,系統的 php.ini 會影響伺服器內所有網站,所以系統管理員會使用這個方法讓各網站管理員自行設定 PHP。
由於這個檔案是取代系統的 php.ini,它與系統的 php.ini 具有同等的地位,例如它容許所有類別的 directive。
若果網站的根目錄找不到 php.ini,系統會到其他地方尋找,但這些 php.ini 未必有你需要的設定,你也未必有權限修改這些 php.ini,所以若果你的伺服器容許本地的 php.ini,你應該自行設定一個在網站的根目錄。
4. .htaccess
這個方法適用於所有 PHP 版本,PHP 必須以 Apache module 的模式運作,包含 .htaccess 的目錄須具備由 httpd.conf 賦予的 AllowOverride All 或 AllowOverride Options 權限。可更改的 directive 類別包括 PHP_INI_ALL 和 PHP_INI_PERDIR。
這個方法用來設定一些只在當前目錄及其子目錄才適用的 directive。
須注意這個方法可以修改的 directive 有限制,例如 PHP_INI_USER 類別的 directive 便不能修改,這些 directive 可以在 PHP 程式中使用 ini_set() 函式設定。
由於 PHP 的常數 (例如 E_ALL) 只有 PHP 能明白,這個由 Apache 讀取的檔案便不能包含 PHP 常數,只能使用對應的數值。
5. .user.ini
這個方法適用於所有 PHP 5.3 或以後版本,PHP 必須以 CGI / FastCGI SAPI 模式運作,可更改的 directive 類別包括 PHP_INI_ALL、PHP_INI_USER 和 PHP_INI_PERDIR。
這個方法用來設定一些只在當前目錄及其子目錄才適用的 directive,它的功能和 .htaccess 差不多,但適用的運作環境不同,可更改的 directive 類別也有分別。
這個設定檔的名稱可以在 php.ini 內使用 user.ini.filename 來設定,若果沒有 (或者忘記了) 設定,PHP 不會讀取這個檔案。
儘管這個方法是在 CGI 模式下使用,但這個檔案不是在每次執行 PHP 程式時都會被讀取,讀取的間隔由 php.ini 內 user.ini.cache_ttl 設定,預設值是 5 分鐘。
若果當前的目錄沒有 .user.ini,PHP 會到上一層目錄尋找,如此類推,直至到達 document_root 為止。
6. ini_set()
這個方法適用於所有 PHP 版本,在任何運作環境都可以使用,可更改的 directive 類別包括 PHP_INI_ALL 和 PHP_INI_USER。
這個方法用來設定一些只在當前的程式才適用的 directive,它可以與 .htaccess 互相配合使用。
須注意有些 directive 儘管可以用這個方法設定,但卻不會見到任何效果,例如 upload_max_filesize,因為檔案上傳的時候,程式尚未執行,當執行程式更改這個 directive 的時候,已經無法對檔案的大小施加任何新的限制了。類似的 directive 還有 register_globals、magic_quotes_gpc 等等。
你有甚麼設定的 PHP 的心得和經驗可以與大家分享?
- .htaccess
- apache
- apache module
- cgi
- ini_set
- php 設定
- php_ini_all
- php_ini_perdir
- php_ini_system
- php_ini_user
- php.ini