php_sapi_name()常见返回值有"cli"、"fpm-fcgi"、"apache2handler"、"cgi-fcgi"、"cli-server"、"phpdbg"、"embed"、"litespeed"等,反映PHP加载方式而非请求类型。

php_sapi_name() 返回值有哪些常见类型
直接看返回值比猜模式更可靠。php_sapi_name() 不是布尔判断函数,它返回字符串,代表当前 PHP 运行所依赖的服务器接口(SAPI)。常见值包括:"cli"(命令行)、"fpm-fcgi"(PHP-FPM)、"apache2handler"(mod_php)、"cgi-fcgi"(传统 CGI),还有 "embed" 或 "litespeed" 等小众情况。
用 php_sapi_name() 判定 CLI 模式要防假阳性
很多人只写 php_sapi_name() === 'cli',但实际部署中可能遇到意外:比如某些容器环境或自定义 SAPI 会返回 "cli-server"(内置服务器)或 "phpdbg"(调试器),它们也属于“非 Web 请求”,但行为不完全等同于标准 CLI。判断是否真正在终端执行脚本,建议加一层保险:
if (php_sapi_name() === 'cli' && !isset($_SERVER['REMOTE_ADDR'])) {
// 更稳妥的 CLI 入口判定
}
注意:$_SERVER['REMOTE_ADDR'] 在 CLI 下通常未定义,但在某些 Web SAPI(如 FPM)被误调用时可能残留或被伪造,所以两者合判更稳。
在 Web 环境里用 php_sapi_name() 区分 Nginx + PHP-FPM 和 Apache
如果要做配置适配(比如日志路径、重写规则兼容),不能只靠 $_SERVER['SERVER_SOFTWARE'],因为容易被伪造或缺失。用 php_sapi_name() 更底层:
立即学习“PHP免费学习笔记(深入)”;
-
"fpm-fcgi"→ 99% 是 Nginx + PHP-FPM 组合(也可能配了 Apache + mod_proxy_fcgi,但少见) -
"apache2handler"→ Apache 直接加载 PHP 模块(mod_php) -
"cgi-fcgi"→ 旧式 CGI/FastCGI,需额外检查$_SERVER['GATEWAY_INTERFACE']确认
注意:PHP-FPM 下 $_SERVER['SERVER_SOFTWARE'] 是 Nginx 的值,而 php_sapi_name() 是 "fpm-fcgi" —— 二者来源不同,别混用。
php_sapi_name() 在 Docker 或 Swoole 场景下的局限性
在容器或协程环境中,php_sapi_name() 可能返回 "cli" 即使它跑的是 HTTP 服务(比如用 php -S 或 Swoole 启动的常驻进程)。这时候单靠它无法区分“是不是 Web 请求”。真正需要的是上下文判断:
- 有
$_SERVER['REQUEST_METHOD']?→ 很可能是 Web 请求 - 有
$_SERVER['argv'][0]且无$_SERVER['REQUEST_URI']?→ 更倾向 CLI - Swoole 应用里应优先用
Swoole\Http\Server实例状态,而不是依赖 SAPI 名
本质问题:SAPI 名反映的是 PHP 如何被加载,不是当前请求类型。这个区别一旦忽略,路由分发、日志级别、甚至数据库连接池初始化都可能出错。











