多环境下phpinfo结果不同_对比不同PHP环境输出差异【分析】

CLI与Web环境phpinfo()输出不同,因二者为独立SAPI,加载不同配置文件、扩展及环境变量;需对比php --ini与phpinfo()中Loaded Configuration File和Scan this dir路径。

不同环境下 phpinfo() 输出不一致,不是配置写错了,而是 PHP 的加载机制本身就会导致结果差异——模块、扩展、ini 文件路径、SAPI 类型,全都会影响最终显示内容。

为什么 CLI 和 Web 环境的 phpinfo() 完全不一样

CLI(命令行)和 Web(如 Apache/FPM)是两个独立的 SAPI,各自加载不同的配置文件、扩展和环境变量。它们甚至可能指向完全不同的 PHP 二进制或配置目录。

  • php -i 显示的是 CLI SAPI 的配置,php --ini 能看到它实际加载的 php.ini 路径
  • Web 环境下访问 phpinfo.php,输出取决于当前 Web 服务器使用的 SAPI(比如 php-fpmmod_php),其 Loaded Configuration File 项才是真实生效的 ini 文件
  • 常见陷阱:改了 /etc/php/8.1/cli/php.ini,但 Web 用的是 /etc/php/8.1/fpm/php.ini,自然看不到效果

如何快速定位两个环境加载了哪些 ini 文件

关键不是看「有没有启用某个扩展」,而是确认「这个扩展是否被当前 SAPI 加载」。不同 SAPI 的 Scan this dir for additional .ini files 路径往往不同。

  • 在 CLI 执行:
    php --ini
  • 在 Web 环境的 phpinfo() 页面里搜索 Loaded Configuration FileScan this dir 两行
  • 对比两者「额外加载的 ini 目录」是否一致,例如:/etc/php/8.1/cli/conf.d/ vs /etc/php/8.1/fpm/conf.d/
  • 同一扩展(如 opcache)可能在 CLI 的 conf.d/10-opcache.ini 里被注释掉,却在 FPM 的同名文件里是启用的

phpinfo() 中「Directive」表格里的 local value / master value 是啥意思

这反映的是运行时配置的层级覆盖关系,不是 bug,是 PHP 的设计逻辑:

  • Master Value:来自 php.ini.ini 文件的原始值(即磁盘上写的值)
  • Local Value:当前请求上下文实际生效的值,可能被 ini_set().htaccess(Apache)、php_admin_flag(FPM pool 配置)或环境变量(如 PHP_INI_SCAN_DIR)覆盖
  • 例如:display_errorsphp.ini 里是 Off(master),但在某 vhost 的 .htaccess 里设为 On,local 就会显示 On
  • FPM 场景下,pool 配置中的 php_admin_value[error_log] 会强制覆盖 ini 设置,且无法被 ini_set() 修改

真正难排查的,往往是「某个扩展在 CLI 里 extension_loaded() 返回 true,但在 Web 里 false」——这时候别急着重装,先比对两个环境的 Scan this dir 下对应 .ini 文件是否存在、是否启用、是否拼错扩展名(比如 redis.so 写成 redis.s0),这些细节比语法错误更常导致差异。