Apache需通过PHP模块(如libphp.so)支持PHP解析,而非仅安装PHP扩展;须确认模块存在、正确LoadModule、匹配prefork MPM,并验证配置。

Apache 本身不处理 PHP,必须通过模块(如 libphp.so 或 php_module)让 Apache 能调用 PHP 解释器。直接“安装 PHP 扩展”和“把 PHP 加进 Apache”是两件事——前者是给 PHP 本体加功能(比如 pdo_mysql),后者是让 Apache 能运行 PHP 文件。你真正要做的,是启用 Apache 的 PHP 模块支持。
确认 PHP 是否已以模块方式安装
很多系统(尤其是 Ubuntu/Debian)装的 php 包默认已包含 Apache 模块,并自动启用;而 CentOS/RHEL 的 php-fpm 包则默认不带 Apache 模块,需额外安装 php-common 和 php-cli,再手动加载模块。
- 运行
apache2ctl -M | grep php(Ubuntu/Debian)或httpd -M | grep php(CentOS/RHEL),看是否已有php7_module或php_module - 若无输出,说明模块未加载;但别急着编译——先查
php -v确认 PHP 已安装,再查find /usr -name "libphp*.so" 2>/dev/null看模块文件是否存在 - 常见路径:
/usr/lib/apache2/modules/libphp.so(Debian)、/usr/lib64/httpd/modules/libphp7.so(RHEL)
在 httpd.conf 或 mods-enabled 中加载 PHP 模块
Apache 不会自动发现 PHP 模块,必须显式 LoadModule 并配置 AddHandler。路径和模块名必须严格匹配实际文件,否则启动报错 Cannot load modules/libphp.so into server。
- 编辑主配置文件(如
/etc/apache2/apache2.conf或/etc/httpd/conf/httpd.conf),添加:LoadModule php_module /usr/lib/apache2/modules/libphp.so
SetHandler application/x-httpd-php - Debian/Ubuntu 用户更推荐用
a2enmod php(对应php7.4或php8.2),它会自动处理符号链接和依赖 - RHEL/CentOS 8+ 使用
dnf install php-apache,该包会自带正确LoadModule行并放入/etc/httpd/conf.modules.d/15-php.conf
PHP 文件不解析?检查 MPM 和模块冲突
Apache 的 MPM(如 event、prefork)会影响 PHP 模块能否加载。libphp.so 只兼容 prefork MPM,若当前是 event,httpd 启动会失败并报错 Invalid argument: couldn't create or get scoreboard。
立即学习“PHP免费学习笔记(深入)”;
- 运行
apache2ctl -V | grep MPM或httpd -V | grep MPM查当前 MPM - Debian:改用
a2dismod mpm_event && a2enmod mpm_prefork;RHEL:编辑/etc/httpd/conf.modules.d/00-mpm.conf,注释event行,取消注释prefork行 - 重启前务必运行
apache2ctl configtest或httpd -t验证语法,避免服务起不来 - 别漏掉
中的AllowOverride All和Require all granted,否则即使模块加载成功,也可能 403 或直接下载 .php 文件
最常被忽略的是 MPM 类型与 PHP 模块的硬性绑定关系——哪怕所有配置都对,只要 MPM 不匹配,PHP 就不会工作。另外,libphp.so 是线程不安全的,它只在 prefork 下可靠;如果真需要 event + PHP,得换用 PHP-FPM + proxy_fcgi,那已是另一套架构了。











