现代生产环境应选php-fpm而非mod_php,因其支持动态伸缩、平滑重启和细粒度资源控制;需匹配Event MPM与KeepAlive、启用OPcache并优化配置、禁用.htaccess解析以提升PHP执行效率。

如果您正在为 Apache 服务器配置 PHP 运行环境,却在 PHP-FPM 与 mod_php 两种模式之间难以抉择,则需明确二者在架构、资源管理与交互机制上的根本差异。以下是针对该问题的多种对比路径:
一、运行架构与进程模型差异
mod_php 将 PHP 解释器直接编译为 Apache 的一个动态模块(如 libphp.so),随每个 Apache 子进程一同加载并驻留内存;而 PHP-FPM 则以完全独立的守护进程形式运行,Apache 通过 FastCGI 协议(通常经由 proxy_fcgi 模块)将 PHP 请求转发至 PHP-FPM 进程池处理。
1、mod_php 模式下,Apache 主进程崩溃将导致所有 PHP 执行立即中断。
2、PHP-FPM 模式下,PHP 进程异常仅影响当前工作子进程,master 进程可自动拉起新 worker。
立即学习“PHP免费学习笔记(深入)”;
3、mod_php 无法为不同虚拟主机分配独立用户权限,所有站点共享同一 Apache 用户上下文。
4、PHP-FPM 支持 per-pool 配置,可为每个站点指定独立的运行用户、内存限制与超时策略。
二、资源占用与内存管理方式
mod_php 的内存开销与 Apache 并发模型强耦合:无论请求是否涉及 PHP 脚本,每个 prefork 或 worker 子进程均强制载入完整 PHP 解释器及扩展,造成静态资源请求时的冗余内存占用;PHP-FPM 则采用按需调度的进程池机制,仅在收到 .php 后缀或匹配 Location 指令的请求时才分发至活跃 worker,显著降低单位请求的平均内存 footprint。
1、在 100 并发连接场景下,mod_php 的 Apache 进程平均内存占用比 PHP-FPM 高出约 35%–45%。
2、PHP-FPM 可通过 pm=dynamic 配置实现子进程弹性伸缩,空闲时自动回收多余 worker,高峰时按需扩容。
3、mod_php 不支持 opcache 共享内存跨进程复用,每个 Apache 子进程维护独立的 opcache 实例,缓存命中率受限。
4、PHP-FPM 的 opcache 可配置为共享内存段(opcache.memory_consumption),所有 worker 进程共用同一份字节码缓存,提升整体命中率。
三、安全隔离与多租户支持能力
mod_php 缺乏进程级隔离机制,所有 PHP 脚本在 Apache 进程用户权限下执行,一旦某站点存在代码注入漏洞,攻击者可轻易读取同服务器其他站点的配置文件或源码;PHP-FPM 通过独立进程池与 Linux 用户命名空间结合,可在内核层面实现文件系统与进程视图的硬隔离。
1、使用 mod_php 时,无法阻止同一 Apache 实例下的不同虚拟主机相互访问 /var/www/other-site/.env 文件。
2、PHP-FPM 可为 each vhost 定义专属 pool,设置 listen.owner = site1user、listen.group = www-data,配合 open_basedir 严格限定路径。
3、mod_php 无法启用 PHP 的 disable_functions 与 disable_classes 对单个站点生效,全局配置即全站生效。
4、PHP-FPM pool 级别支持 php_admin_value 和 php_admin_flag 指令,可单独禁用 exec、system 等高危函数而不影响其他站点。
四、Apache 配置与通信协议实现
mod_php 依赖 Apache 的模块加载机制(LoadModule php8_module modules/libphp8.so),其 SAPI 层直接调用 Apache API 输出响应;PHP-FPM 则必须启用 mod_proxy_fcgi 模块,并通过 ProxyPassMatch 或 SetHandler 指令将匹配请求代理至 PHP-FPM 的 Unix socket 或 TCP 端口,通信链路增加一层 FastCGI 协议解析开销,但换来解耦优势。
1、启用 mod_php 后,Apache 配置中无需任何 Proxy 或 Handler 显式声明即可解析 .php 文件。
2、启用 PHP-FPM 必须加载 mod_proxy 和 mod_proxy_fcgi,且需确认 httpd -M 输出中包含 proxy_fcgi_module。
3、mod_php 的错误日志直接写入 Apache error_log,无法区分是 Apache 核心错误还是 PHP 运行时异常。
4、PHP-FPM 提供独立的 slowlog 和 access.log,可精准记录单个请求的脚本执行时间、入口文件与查询参数。
五、兼容性与部署验证方法
mod_php 仅适配 Apache HTTP Server,且对 MPM 模型有强依赖(prefork 是唯一稳定支持的模式);PHP-FPM 无 Web 服务器绑定,除 Apache 外还可对接 Nginx、Lighttpd 或 Caddy,同时支持多版本 PHP 并行运行——只需启动不同端口或 socket 的多个 php-fpm.service 实例。
1、验证 mod_php 是否生效:创建 info.php 文件并访问,phpinfo() 输出中 Server API 必须显示为 Apache 2.0 Handler。
2、验证 PHP-FPM 是否生效:在 Apache 配置中检查 ProxyPassMatch 表达式是否覆盖 .php,并确认 php-fpm.sock 文件存在且权限为 660。
3、mod_php 不支持运行时切换 PHP 版本,切换需重新编译 Apache 或替换 libphp.so 并重启整个服务。
4、PHP-FPM 可通过修改虚拟主机的 ProxyPassMatch 目标地址,在不重启 Apache 的前提下将某站点切至 PHP 8.3 的独立 pool。



















