Prefork MPM 是 Apache 的多进程模型,主进程预派生子进程且每个进程处理一个请求,因其进程隔离、兼容非线程安全 PHP 而适合搭配 mod_php;它启动快、配置简单,但进程开销大,高并发下不如 Event + PHP-FPM 或 Nginx + PHP-FPM 高效。
apache 的 prefork mpm 本身不直接运行 php,它只是为 php 提供进程托管环境;php 在 prefork 下通常以 mod_php(即 apache 模块方式) 运行,这是最经典、最稳定的配合方式。
Prefork 是什么,为什么适合搭配 mod_php
Prefork 是 Apache 的一种多进程模型:主进程预派生多个子进程,每个子进程一次只处理一个请求,进程间彼此隔离、无共享内存。这种模型稳定、兼容性强,特别适合运行非线程安全(ZTS disabled)的 PHP 扩展(如大多数传统扩展)。
- PHP 编译时默认关闭线程安全(ZTS),因此不能在 Worker 或 Event 这类多线程 MPM 下直接使用 mod_php
- Prefork 的“一个进程一个请求”模型天然匹配 PHP 的单次执行生命周期,避免变量/资源跨请求污染
- 无需额外进程管理器(如 PHP-FPM),PHP 直接作为 Apache 子模块加载,启动快、配置简单
典型配置要点(httpd.conf 或 mods-enabled)
确保 Apache 启用 prefork MPM,并加载 mod_php 模块:
- 确认启用 prefork:
a2enmod mpm_prefork(Debian/Ubuntu)或检查LoadModule mpm_prefork_module已加载 - 加载 PHP 模块:
LoadModule php_module modules/libphp.so(路径依安装方式而异) - 关联 PHP 文件类型:
AddHandler php-script .php和<filesmatch> SetHandler application/x-httpd-php </filesmatch> - 可调优 prefork 参数(如
StartServers、MaxRequestWorkers)以匹配 PHP 内存占用,避免 fork 过多导致 OOM
为什么不推荐 Prefork + PHP-FPM?
技术上可行(通过 ProxyPass 或 fcgid),但属于“错配”:
- Prefork 进程开销大,每个进程都要维持与 PHP-FPM 的 FastCGI 连接,浪费资源
- PHP-FPM 本为配合 Worker/Event 或 Nginx 等事件驱动服务器设计,发挥其动态进程管理优势需更高并发模型
- 若已用 Prefork,直接 mod_php 更轻量;若追求高并发与资源效率,应改用 Event MPM + PHP-FPM
替代方案对比(何时该换)
当站点并发增长、内存吃紧或需 PHP 独立升级/重启时,可考虑解耦:
立即学习“PHP免费学习笔记(深入)”;
- Apache + Event MPM + PHP-FPM:需 PHP 编译开启 ZTS(较少见),实际更常用于 Nginx
- Nginx + PHP-FPM:当前主流组合,Nginx 负责静态与反向代理,PHP-FPM 管理 PHP 进程,性能与灵活性俱佳
- Apache + mod_proxy_fcgi + PHP-FPM:可作为过渡,但 Prefork 下每个 Apache 进程仍要代理,不如直接换 Nginx 或切 Event(若环境支持)











