对于也有疑问的人。
即使没有加载配置文件(php.ini),PHP也能工作,
它只会将默认值应用于指令。
配置文件(php.ini)在PHP启动时读取。对于PHP的服务器模块版本,这仅在Web服务器启动时发生一次。对于CGI和CLI版本,则在每次调用时发生。
php.ini 在以下位置(按顺序)搜索:
PHPIniDir
指令,CGI和CLI中的-c
命令行选项)
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)。
--with-config-file-path
编译时选项。
如果存在php-SAPI.ini(其中SAPI是正在使用的SAPI,例如php-cli.ini或php-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.
请注意,`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`,或者也影响其他指令。