PHP CLI 与 FPM 区别面试题

4次阅读

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

PHP CLI 与 FPM 区别面试题

运行环境完全不同

PHP-CLI 是命令行接口,直接在终端里执行脚本,不依赖 Web 服务器,也不走 HTTP 协议。比如 php artisan migratephp script.php hello 就是 CLI 场景。

PHP-FPM 是 FastCGI 进程管理器,专为 Web 请求设计,必须配合 nginxapache 使用。它监听 socket 或端口,接收 Web 服务器转发来的 PHP 请求,处理完再把结果交回给 Web 服务器。

生命周期和进程模型差异明显

CLI 每次执行都是独立进程:启动 → 执行脚本 → 释放资源 → 退出。没有常驻内存,也没有请求循环

FPM 是常驻服务:master 进程管理多个 worker 进程,每个 worker 循环等待请求、处理、返回,直到被回收或重启。这种设计避免了反复加载解析器的开销,适合高并发 Web 场景。

立即学习PHP免费学习笔记(深入)”;

可用变量和扩展支持有区别

CLI 下没有 $_GET$_POST$_SERVER[‘REQUEST_URI’] 等超全局变量,因为根本不经过 HTTP 请求流程;但有 $argv$argc 用于接收命令行参数

FPM 下完整支持所有 Web 相关超全局变量,也默认启用 sessioncookie、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_childrenpm.start_serversrequest_terminate_timeout,还要关注慢日志、平滑重启、socket 权限等运维细节。

text=ZqhQzanResources