634 字
3 分钟
PHP 常见运行模式 SAPI 简述

很多人第一次排查 PHP 配置时都会困惑:

同一台机器上,为什么 php -i 看到的值,和 Web 请求实际行为对不上?

核心原因通常不是配置失效,而是你查的是不同运行模式(SAPI)的配置。

什么是 PHP 运行模式(SAPI)#

SAPI(Server API)可以理解为 PHP 与外部环境交互的“运行接口”。

常见模式有:

SAPI 模式典型使用场景常见配置文件位置
CLI终端脚本、计划任务、一次性命令/etc/php/8.3/cli/php.ini
FPMNginx + PHP-FPM 的 Web 请求/etc/php/8.3/fpm/php.ini
ApacheApache mod_php 模式/etc/php/8.3/apache2/php.ini
CGI传统 CGI 方式/etc/php/8.3/cgi/php.ini

这些配置彼此独立。相同参数在不同 SAPI 中可以是不同值。

为什么要按运行模式拆分配置#

因为不同场景目标不同:

  • CLI 更偏任务执行:可能需要更长执行时间、更大内存。
  • Web 请求更偏稳定性:通常需要更严格超时与资源限制。

如果只有一套配置,往往会出现冲突:

  • 对 CLI 合适的设置,可能让 Web 风险升高。
  • 对 Web 合适的限制,可能让 CLI 任务频繁失败。

按 SAPI 隔离配置,本质上是“按场景定策略”。

一个快速判断技巧#

看路径中的目录名即可识别 SAPI:

Terminal window
/etc/php/8.3/cli/php.ini # CLI
/etc/php/8.3/fpm/php.ini # FPM
/etc/php/8.3/apache2/php.ini # Apache
/etc/php/8.3/cgi/php.ini # CGI

排查时最容易犯的错#

很多人会直接用:

Terminal window
php -i

这条命令只反映 CLI 的配置视角。

如果你在排查 Web 请求行为,应优先看对应 Web SAPI(通常是 FPM 或 Apache)的配置。

正确排查姿势#

1)确认当前请求经过哪个 SAPI#

先确认部署链路是 Nginx -> FPM,还是 Apache mod_php,再决定查哪个 php.ini

2)查看对应 SAPI 的运行信息#

Terminal window
php-fpm8.3 -i | grep upload_max_filesize

关键点是命令要用对应二进制(如 php-fpm8.3),而不是 php

3)直接核对目标配置文件#

Terminal window
sudo grep -E "^upload_max_filesize|^post_max_size" /etc/php/8.3/fpm/php.ini

隐藏坑:conf.d 会覆盖主配置#

每个 SAPI 除了主 php.ini,通常还会加载 conf.d 目录中的附加配置:

Terminal window
ls /etc/php/8.3/fpm/conf.d/

这些附加文件中的同名项可能覆盖主配置,所以会出现“改了 php.ini 却不生效”的现象。

可通过以下方式确认加载链:

Terminal window
php-fpm8.3 -i | grep -E "Loaded Configuration|Additional .ini"

总结#

一句话记住:

php -i 只代表 CLI;你要排查哪个运行模式,就查那个 SAPI 的配置与加载链。

只要先分清 SAPI,再谈参数调优,PHP 配置排查会清晰很多。

PHP 常见运行模式 SAPI 简述
https://blog.cuixu.cn/posts/php/php-cli-vs-fpm-ini/
作者
崔旭
发布于
2026-04-21
许可协议
CC BY-NC-SA 4.0