配置文件

配置文件(php.ini)在 PHP 啟動(dòng)時(shí)被讀取。對(duì)于服務(wù)器模塊版本的 PHP,僅在 web 服務(wù)器啟動(dòng)時(shí)讀取一次。對(duì)于 CGICLI 版本,每次調(diào)用都會(huì)讀取。

php.ini 的搜索路徑如下(按順序):

  • SAPI 模塊所指定的位置(Apache 2 中的 PHPIniDir 指令,CGI 和 CLI 中的 -c 命令行選項(xiàng))。
  • PHPRC 環(huán)境變量。
  • 可以為不同版本的 PHP 指定不同的 php.ini 文件位置。注冊(cè)表目錄所在的位置取決于你的系統(tǒng)是 32 位還是 64 位。32-bit 的 PHP 運(yùn)行在 32-bit 的系統(tǒng)或 64-bit 的 PHP 運(yùn)行在 64-bit 系統(tǒng)時(shí)使用 [(HKEY_LOCAL_MACHINE\SOFTWARE\PHP] 32-bit 的 PHP 運(yùn)行在 64-bit 的系統(tǒng)上時(shí),則使用 [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]] 替代。 系統(tǒng)版本跟 PHP 版本架構(gòu)一致時(shí),會(huì)按以下順序依次進(jìn)行檢查: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y][HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x],其中的 x,y 和 z 指的是 PHP 主版本號(hào),次版本號(hào)和發(fā)行批次。 對(duì)于 32 bit 版本的 PHP 運(yùn)行在 64 bit 系統(tǒng)上的情況,則會(huì)按以下順序依次進(jìn)行檢查: [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y][HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x],其中的 x,y 和 z 指的是 PHP 主版本號(hào),次版本號(hào)和發(fā)行批次。如果在其中任何目錄下的 IniFilePath 有鍵值,則第一個(gè)值將被用作 php.ini 的位置(僅適用于 Windows)。
  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP] 內(nèi) IniFilePath 的值(Windows 注冊(cè)表位置)。
  • 當(dāng)前工作目錄(對(duì)于 CLI)。
  • web 服務(wù)器目錄(對(duì)于 SAPI 模塊)或 PHP 所在目錄(Windows 下其它情況)。
  • Windows 目錄(C:\windowsC:\winnt),或 --with-config-file-path 編譯時(shí)選項(xiàng)指定的位置。

如果存在 php-SAPI.ini(SAPI 是當(dāng)前所用的 SAPI 名稱,因此實(shí)際文件名為 php-cli.iniphp-apache.ini 等),則會(huì)用它替代 php.ini。SAPI 的名稱可以用 php_sapi_name() 來(lái)測(cè)定。

注意:

Apache web 服務(wù)器在啟動(dòng)時(shí)會(huì)把目錄轉(zhuǎn)到根目錄,這將導(dǎo)致 PHP 嘗試在根目錄下讀取 php.ini,如果存在的話。

php.ini 中可以使用環(huán)境變量,如下示例:

示例 #1 php.ini 中的環(huán)境變量

; PHP_MEMORY_LIMIT 來(lái)自于環(huán)境變量的值
memory_limit = ${PHP_MEMORY_LIMIT}

由擴(kuò)展庫(kù)處理的 php.ini 指令,其文檔分別在各擴(kuò)展庫(kù)的頁(yè)面。內(nèi)核配置選項(xiàng)見(jiàn)附錄。不過(guò)也許不是所有的 PHP 指令都在手冊(cè)中有文檔說(shuō)明。要得到自己的 PHP 版本中的配置指令完整列表,請(qǐng)閱讀 php.ini 文件,其中都有注釋。此外,也許從 Git 得到的? 最新版 php.ini 也有幫助。

示例 #2 php.ini 例子

; any text on a line after an unquoted semicolon (;) is ignored
[php] ; section markers (text within square brackets) are also ignored
; Boolean values can be set to either:
;    true, on, yes
; or false, off, no, none
register_globals = off
track_errors = yes

; you can enclose strings in double-quotes
include_path = ".:/usr/local/lib/php"

; backslashes are treated the same as any other character
include_path = ".;c:\php\lib"

在 .ini 文件內(nèi)可能會(huì)引用已存在的 .ini 變量。例如:open_basedir = ${open_basedir} ":/new/dir"

掃描路徑配置

可以通過(guò)配置,讓 PHP 在讀完 php.ini 后,掃描指定路徑中的附加 .ini 配置文件。編譯時(shí)通過(guò) --with-config-file-scan-dir 參數(shù)來(lái)指定要掃描的目錄。掃描路徑也可以通過(guò)環(huán)境變量 PHP_INI_SCAN_DIR 來(lái)設(shè)置。

通過(guò)在掃描路徑配置中加入特定系統(tǒng)的目錄分隔符(Windows、NetWare 和 RISC OS 下是 ;;其它操作系統(tǒng)下是 :;該值可以通過(guò) PHP 常量 PATH_SEPARATOR 獲?。?,還可以設(shè)置多個(gè)掃描路徑。如果 PHP_INI_SCAN_DIR 為空,PHP 一樣會(huì)掃描在編譯時(shí)指定的 --with-config-file-scan-dir 此路徑。

對(duì)于每個(gè)目錄而言,PHP 會(huì)以首字符順序?yàn)閮?yōu)先級(jí),掃描該目錄下所有的 .ini 結(jié)尾的配置文件。所有被截入的配置文件,可以通過(guò) php_ini_scanned_files() 函數(shù)來(lái)獲取列表,也可以通過(guò) PHP 命令行加入 --ini 參數(shù)來(lái)查看。

以下假設(shè) PHP 配置為 --with-config-file-scan-dir=/etc/php.d
并且目錄分隔符為 :

$ php
  PHP 會(huì)加載 /etc/php.d/*.ini 全部配置文件。

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php
  PHP 會(huì)加載 /usr/local/etc/php.d/*.ini 全部配置文件。

$ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php
  PHP 會(huì)加載 /etc/php.d/*.ini 下的全部配置文件,然后加載
  /usr/local/etc/php.d/*.ini 下的全部配置文件。

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
  PHP 會(huì)加載 /usr/local/etc/php.d/*.ini 下的全部配置文件,然后加載
  /etc/php.d/*.ini 下的全部配置文件。