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-fpm或mod_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 File和Scan 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 的设计逻辑:
立即学习“PHP免费学习笔记(深入)”;
-
Master Value:来自
php.ini或.ini文件的原始值(即磁盘上写的值) -
Local Value:当前请求上下文实际生效的值,可能被
ini_set()、.htaccess(Apache)、php_admin_flag(FPM pool 配置)或环境变量(如PHP_INI_SCAN_DIR)覆盖 - 例如:
display_errors在php.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),这些细节比语法错误更常导致差异。











