2024年PHP日本大会

配置文件

配置文件(php.ini)在PHP启动时读取。对于PHP的服务器模块版本,这仅在Web服务器启动时发生一次。对于CGICLI版本,则在每次调用时发生。

php.ini 在以下位置(按顺序)搜索:

  • SAPI模块特定位置(Apache 2中的PHPIniDir指令,CGI和CLI中的-c命令行选项)
  • PHPRC环境变量。
  • 可以为不同版本的PHP设置php.ini文件的位置。注册表项的根目录取决于已安装的操作系统和PHP的32位或64位。对于32位操作系统上的32位PHP或64位操作系统上的64位PHP,使用[(HKEY_LOCAL_MACHINE\SOFTWARE\PHP];对于64位操作系统上的32位PHP版本,则使用[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]]。对于相同位数的安装,将按以下顺序检查注册表项:[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的主版本、次版本和发行版本。对于64位操作系统上的32位PHP版本,将按以下顺序检查注册表项:[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的主版本、次版本和发行版本。如果这些键中的任何一个都有IniFilePath的值,则找到的第一个键将用作php.ini的位置(仅限Windows)。
  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP][HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]IniFilePath的值(仅限Windows)。
  • 当前工作目录(CLI除外)。
  • Web服务器的目录(对于SAPI模块),或PHP的目录(否则在Windows中)。
  • Windows目录(C:\windowsC:\winnt)(对于Windows),或--with-config-file-path编译时选项。

如果存在php-SAPI.ini(其中SAPI是正在使用的SAPI,例如php-cli.iniphp-apache.ini),则使用它代替php.ini。可以使用php_sapi_name()确定SAPI名称。

注意:

Apache Web服务器在启动时将目录更改为根目录,导致PHP尝试从根文件系统读取php.ini(如果存在)。

环境变量可以在php.ini中的配置值中引用,如下所示。从PHP 8.3.0开始,可以指定一个回退值,当引用的变量未定义时将使用该值。

示例 #1 php.ini 环境变量

; PHP_MEMORY_LIMIT is taken from environment
memory_limit = ${PHP_MEMORY_LIMIT}
; If PHP_MAX_EXECUTION_TIME is not defined, it will fall back to 30
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}

由扩展处理的php.ini指令记录在各个扩展的页面上。附录中提供了一个核心指令列表。并非所有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文件中引用现有的.ini变量。例如:open_basedir = ${open_basedir} ":/new/dir"

扫描目录

可以将PHP配置为在读取php.ini后扫描目录中的.ini文件。这可以通过在编译时设置--with-config-file-scan-dir选项来完成。然后可以通过设置PHP_INI_SCAN_DIR环境变量来覆盖运行时的扫描目录。

可以通过使用平台特定的路径分隔符(Windows、NetWare和RISC OS上为;;其他平台上为:;PHP使用的值可作为PATH_SEPARATOR常量获得)来分隔多个目录来扫描多个目录。如果PHP_INI_SCAN_DIR中给出了空目录,PHP还将扫描通过--with-config-file-scan-dir在编译时给出的目录。

在每个目录中,PHP将按字母顺序扫描所有以.ini结尾的文件。可以通过调用php_ini_scanned_files()或使用--ini选项运行PHP来获得已加载文件的列表及其顺序。

Assuming PHP is configured with --with-config-file-scan-dir=/etc/php.d,
and that the path separator is :...

$ php
  PHP will load all files in /etc/php.d/*.ini as configuration files.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php
  PHP will load all files in /usr/local/etc/php.d/*.ini as
  configuration files.

$ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php
  PHP will load all files in /etc/php.d/*.ini, then
  /usr/local/etc/php.d/*.ini as configuration files.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
  PHP will load all files in /usr/local/etc/php.d/*.ini, then
  /etc/php.d/*.ini as configuration files.
添加注释

用户贡献的注释 2条注释

weili
3年前
对于也有疑问的人。

即使没有加载配置文件(php.ini),PHP也能工作,
它只会将默认值应用于指令。
Pictor13
1年前
请注意,`error_reporting`无法使用环境变量进行插值(例如`error_reporting = ${PHP_ERROR_REPORTING}`)。

`error_reporting`的处理方式与其他指令不同。
如果分配了环境变量,则会静默忽略并替换为值`0`(即无报告)。

我找不到相关的文档。
也许应该在https://github.com/php/php-src/blob/8f5156fcba9906664ecd97e4c279ee980e522121/php.ini-production#L451-L500中添加此信息?

我不确定这种特定行为是否只影响`error_reporting`,或者也影响其他指令。
To Top