对于想知道的人。
即使没有加载配置文件(php.ini),PHP 也能工作,
它只会将默认值应用于指令。
配置文件 (php.ini) 在 PHP 启动时读取。对于 PHP 的服务器模块版本,这仅在 Web 服务器启动时发生一次。对于 CGI 和 CLI 版本,它在每次调用时都会发生。
php.ini 在以下位置(按顺序)中搜索
PHPIniDir
指令在 Apache 2 中,-c
命令行选项在 CGI 和 CLI 中)
[(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 中使用,如下所示。
示例 #1 php.ini 环境变量
; PHP_MEMORY_LIMIT is taken from environment memory_limit = ${PHP_MEMORY_LIMIT}
由扩展处理的 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` 还是其他指令。
对于想要完全忽略任何目录的任何人
在 Linux Redhat 发行版上(这是在 EL9 上)
; 如果使用 php-fpm,请将此文件放在“
/etc/systemd/system/php-fpm.service.d/override.conf
[Service]
Environment="PHP_INI_SCAN_DIR="
; 执行 systemd 配置重新加载
systemctl daemon-reload
; 如果你想确保 CLI 上的 php 如果没有传递 'PHP_INI_SCAN_DIR= php' 就会失败(这应该也影响 Linux 普通用户和系统用户?),那么将此文件放在相应位置
cat /etc/php.d/00-dont-use-phpd.ini
auto_prepend_file=MISSING_ENV__PHP_INI_SCAN_DIR__SEE_ETC_PHPD_00_DONT_USE_PHPD_INI
; 不允许 php.d 目录加载文件
; 您必须在 CLI 上的 php 命令之前传递 'PHP_INI_SCAN_DIR= '
; 参考
; https://php.net/manual/en/configuration.file.php#configuration.file.scan
在 php.ini 中,您可以使用语法 ${varname} 引用现有指令或环境变量。
以下是一些示例。
sys_temp_dir = "${WINDIR}"
--- ${WINDIR} 将在运行时替换为 $_ENV['WINDIR']
--- 您可以通过 Apache 设置环境变量,并在 php.ini 中使用它们
--- FcgidInitialEnv AUTHOR "WUXIANCHENG"
--- error_log = "${AUTHOR}.log"
error_log = "${sys_temp_dir}"
--- ${sys_temp_dir} 将替换为 sys_temp_dir 的值
您也可以在 php.ini 中使用 PHP 常量,但不要将它们括在 ${} 或 "" 中。
error_log = "/data/"PHP_VERSION"/"
--- 它就像这样工作 php 代码
$error_log = "/data/" . PHP_VERSION . "/";