配置文件

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

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

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

如果存在 php-SAPI.ini(SAPI 是當前所用的 SAPI 名稱,因此實際文件名為 php-cli.iniphp-apache.ini 等),則會用它替代 php.ini。SAPI 的名稱可以用 php_sapi_name() 來測定。

注意:

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

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

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

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

由擴展庫處理的 php.ini 指令,其文檔分別在各擴展庫的頁面。內(nèi)核配置選項見附錄。不過也許不是所有的 PHP 指令都在手冊中有文檔說明。要得到自己的 PHP 版本中的配置指令完整列表,請閱讀 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)可能會引用已存在的 .ini 變量。例如:open_basedir = ${open_basedir} ":/new/dir"。

掃描路徑配置

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

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

對于每個目錄而言,PHP 會以首字符順序為優(yōu)先級,掃描該目錄下所有的 .ini 結(jié)尾的配置文件。所有被截入的配置文件,可以通過 php_ini_scanned_files() 函數(shù)來獲取列表,也可以通過 PHP 命令行加入 --ini 參數(shù)來查看。

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

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

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

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

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