SAPI类型决定phpinfo输出差异:FPM与CLI在模块加载、配置层级、环境变量、进程模型上系统不同,如opcache默认仅FPM启用,FPM读取pool配置而CLI不读,FPM显示完整$_SERVER和FastCGI变量,CLI仅显示基础变量。

一、SAPI类型决定phpinfo输出的核心差异
PHP 的 SAPI(Server Application Programming Interface)决定了 PHP 的运行环境与上下文,而 phpinfo() 函数的输出内容会因 SAPI 类型不同而显著变化。FPM 与 CLI 是两种最常用的 SAPI,它们在模块加载、配置项可见性、环境变量、超时设置、内存限制等关键字段上存在系统性差异。以下是具体对比方式:
1、在 Web 环境中访问一个包含 的 PHP 文件,确认其由 Nginx/Apache + PHP-FPM 驱动;
2、在终端中执行 php -i 命令,确保调用的是 CLI SAPI;
3、将两次输出分别保存为文本,使用 diff 工具或人工比对关键区块。
立即学习“PHP免费学习笔记(深入)”;
二、模块加载状态差异
FPM 和 CLI 各自独立加载扩展,即使扩展名相同,启用状态也可能不同。例如 opcache 在 FPM 中默认启用以加速 Web 请求,但在 CLI 中通常禁用,因其对单次脚本执行收益有限;apcu 的用户缓存功能在 CLI 下可能不可用,除非显式启用 apc.enable_cli=1。
1、检查 FPM 输出中 "Loaded Modules" 区块是否包含 mod_php(实际不会出现,因 FPM 不是 Apache 模块)或 fpm;
2、检查 CLI 输出中该区块是否列出 cli 而非 fpm;
3、比对 "apcu"、"opcache"、"xdebug" 等扩展的 "Directive" 行是否显示 "Local Value" 与 "Master Value" 不一致。
三、配置项覆盖层级不同
FPM 使用三层配置叠加:全局 php.ini → fpm pool 配置(如 www.conf 中的 php_admin_value 或 php_flag)→ 运行时 ini_set();CLI 仅受 php.ini 和命令行参数(如 -d memory_limit=512M)影响,不读取 fpm pool 配置。
1、在 FPM 输出中查找 "Configuration File (php.ini) Path" 与 "Loaded Configuration File",确认其路径是否指向 /etc/php/*/fpm/php.ini;
2、在 CLI 输出中确认 "Loaded Configuration File" 是否为 /etc/php/*/cli/php.ini;
3、搜索 "max_execution_time",FPM 下通常为 30(受 Web 超时约束),CLI 下常为 0(无限制);
4、搜索 "memory_limit",FPM 多设为 128M,CLI 常为 -1 或 512M。
四、环境变量与 $_SERVER 可见性差异
CLI 模式下 $_SERVER 数组精简,仅含基本键如 argv、argc、PWD;FPM 模式则完整填充 CGI/FastCGI 标准变量,如 REQUEST_METHOD、HTTP_USER_AGENT、SCRIPT_FILENAME、GATEWAY_INTERFACE 等,这些在 CLI 的 phpinfo() 中完全缺失或显示为 no value。
1、在 FPM 的 phpinfo() 页面中定位 "$_SERVER" 表格,观察是否存在 HTTP_HOST、REMOTE_ADDR 等字段;
2、在 CLI 的 php -i 输出中搜索 "$_SERVER",确认其仅列出 argv、argc、PHP_SELF 等极少数项;
3、比对 "Environment" 区块:FPM 中该区块为空或仅含 FastCGI 内部变量,CLI 中则完整显示 shell 环境变量(如 PATH、HOME)。
五、进程模型与运行时参数体现
phpinfo() 会明确标识当前 SAPI 名称及底层进程特征。FPM 输出中会出现 "Server API" 为 "FPM/FastCGI",并显示 "master process" 和 "worker processes" 相关信息;CLI 则显示 "Server API" 为 "Command Line Interface",且无任何进程管理字段。
1、在两份输出中分别搜索 "Server API",验证其值分别为 "FPM/FastCGI" 与 "Command Line Interface";
2、在 FPM 输出中查找 "master process" 字样,确认其出现在 "PHP Variables" 或 "Core" 区块;
3、在 CLI 输出中确认不存在 "pool"、"listen"、"pm.max_children" 等 FPM 特有配置项。











