配置文件

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

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

  • SAPI 模块特定位置 (PHPIniDir 指令在 Apache 2 中,-c 命令行选项在 CGI 和 CLI 中)
  • PHPRC 环境变量。
  • 配置文件的存放位置可以通过不同的PHP版本进行设置。注册表键的根目录取决于已安装的操作系统和 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 中使用,如下所示。

示例 #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.
添加注释

用户贡献的注释 4 个注释

weili
3 年前
对于想知道的人。

即使没有加载配置文件(php.ini),PHP 也能工作,
它只会将默认值应用于指令。
Pictor13
8 个月前
请注意,`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` 还是其他指令。
atv dot seth at gmail dot com
8 个月前
对于想要完全忽略任何目录的任何人

在 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
ohcc at 163 dot com
7 年前
在 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 . "/";
To Top