php-cli与php-fpm运行环境、生命周期、变量支持、适用场景及配置方向均不同:cli用于命令行脚本,独立进程,支持$argv;fpm为常驻web服务,支持$_get等超全局变量,适用于http请求。

运行环境完全不同
PHP-CLI 是命令行接口,直接在终端里执行脚本,不依赖 Web 服务器,也不走 HTTP 协议。比如 php artisan migrate 或 php script.php hello 就是 CLI 场景。
PHP-FPM 是 FastCGI 进程管理器,专为 Web 请求设计,必须配合 Nginx 或 Apache 使用。它监听 socket 或端口,接收 Web 服务器转发来的 PHP 请求,处理完再把结果交回给 Web 服务器。
生命周期和进程模型差异明显
CLI 每次执行都是独立进程:启动 → 执行脚本 → 释放资源 → 退出。没有常驻内存,也没有请求循环。
FPM 是常驻服务:master 进程管理多个 worker 进程,每个 worker 循环等待请求、处理、返回,直到被回收或重启。这种设计避免了反复加载解析器的开销,适合高并发 Web 场景。
立即学习“PHP免费学习笔记(深入)”;
可用变量和扩展支持有区别
CLI 下没有 $_GET、$_POST、$_SERVER['REQUEST_URI'] 等超全局变量,因为根本不经过 HTTP 请求流程;但有 $argv 和 $argc 用于接收命令行参数。
FPM 下完整支持所有 Web 相关超全局变量,也默认启用 session、cookie、output buffering 等机制。部分扩展(如某些调试或监控工具)可能只在 FPM 或 CLI 中启用,需检查 phpinfo() 或 php -m 对比确认。
适用场景不能混用
- 选 CLI:定时任务(crontab)、数据导入导出、队列消费、本地开发调试、一键部署脚本
- 选 FPM:用户访问网站、API 接口响应、需要 session 登录态、依赖 URL 路由或重写规则的项目
- 注意:FPM 不能直接执行 cron 任务,CLI 也不能响应浏览器请求 —— 不是性能问题,而是架构定位不同
配置与调优方向不一样
CLI 的配置重点在单次脚本执行:比如 memory_limit 可设得很高(如 -1 不限制),max_execution_time 可忽略(默认 0 表示不限时)。
FPM 的配置围绕并发与稳定性:比如 pm.max_children、pm.start_servers、request_terminate_timeout,还要关注慢日志、平滑重启、socket 权限等运维细节。











