apache运行php有三种模式:模块模式(mod_php)将php嵌入apache进程,零通信开销但崩溃影响服务器;cgi模式每次请求启动新php-cgi进程,简单低效;fastcgi模式通过php-fpm复用进程池,性能高、隔离好,推荐生产使用。

Apache 本身不执行 PHP,它只是把请求交给合适的处理器——关键在于你选哪种方式:模块模式(mod_php)、CGI 还是 FastCGI。这三种路径底层逻辑完全不同,直接影响性能、隔离性和调试方式。
模块模式:PHP 嵌入 Apache 进程
PHP 解释器直接编译进 Apache 工作进程,每次请求都在内存里完成解析,零进程通信开销。
- 必须加载 libphp.so(Linux)或 php8apache2_4.dll(Windows),路径要绝对正确,版本需严格匹配 Apache 和 PHP
- 配置核心三行:
LoadModule php_module modules/libphp.so、AddType application/x-httpd-php .php、<filesmatch>SetHandler application/x-httpd-php</filesmatch> - 验证看 phpinfo() 中 “Server API” 显示为 Apache 2.4 Handler,不是 CGI 或 FPM
- 缺点明显:PHP 崩溃会导致 Apache 子进程退出;无法多版本共存;内存常驻,容易累积泄漏
CGI 模式:每次请求启动新进程
Apache 收到 .php 请求后,调用外部 php-cgi 可执行文件,等它跑完、输出结果、再退出。简单但低效。
- 先禁用 mod_php:
#LoadModule php_module modules/libphp.so - 启用 CGI 模块:
LoadModule cgid_module modules/mod_cgid.so - 在
<directory></directory>或虚拟主机中设置:Options +ExecCGI、AddHandler cgi-script .php、Action cgi-script /cgi-bin/php-cgi - 确保
/cgi-bin/php-cgi存在且有执行权限;该文件通常来自 PHP 安装目录的bin/下 - phpinfo() 显示 “Server API:CGI/FastCGI”,但实际是纯 CGI —— 因为没用进程池,每次都是全新进程
FastCGI 模式:复用进程池,推荐生产环境
本质是 CGI 的升级版:一个长期运行的管理器(如 PHP-FPM)维持多个 php-cgi 子进程,Apache 把请求转发过去,子进程处理完不退出,继续待命。
- 不加载 libphp.so,改用代理模块:
LoadModule proxy_module modules/mod_proxy.so和LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so - PHP-FPM 必须已安装并运行(如
systemctl start php8.2-fpm),检查其监听地址(127.0.0.1:9000或 Unix socket) - 在虚拟主机内配置:
<filesmatch>SetHandler "proxy:fcgi://127.0.0.1:9000"</filesmatch>(IP 方式)或SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"(socket 更高效) - phpinfo() 显示 “Server API:FPM/FastCGI”,说明走的是 PHP-FPM,不是 Apache 内置模块
- 优势包括:PHP 崩溃不影响 Apache;支持多 PHP 版本按站点切换;可独立调优(如 pm.max_children);便于监控和日志分离
怎么确认当前走的是哪条路?
只看 phpinfo() 顶部的 “Server API” 字段最准:
- Apache 2.4 Handler → 模块模式
- CGI/FastCGI(且没开 FPM)→ 真 CGI
- FPM/FastCGI → PHP-FPM + mod_proxy_fcgi
别信页面能打开就万事大吉——源码泄露、500 错误、空白页,往往卡在模块没加载、路径写错、权限不足或 PHP-FPM 没监听这几个环节。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











