根本原因是apache未将php视为可执行处理器,需验证三要素:模块是否真加载(httpd -m | grep php或检查loadmodule)、处理器是否注册(sethandler/addhandler绑定.php后缀)、运行环境是否对齐(架构/编译器/selinux/依赖库/端口冲突)。

Apache 无法执行 PHP 文件(比如直接下载 index.php、页面显示源码、或报 Cannot load php_module),根本原因不是“PHP 没装好”,而是 Apache 根本没把 PHP 当成可执行处理器——模块没加载,或加载了但 handler 没绑上。
确认 php_module 是否真被加载
别只看配置里有没有 LoadModule 行,得验证它是否生效:
- Linux/macOS 运行
httpd -M | grep php或apache2ctl -M | grep php,输出应为php_module (shared);为空就说明没加载 - Windows 检查
httpd.conf中LoadModule php_module行是否取消注释,路径是否用英文直双引号"(不是弯引号 “”),且 DLL 文件真实存在 - XAMPP 用户不靠手动
LoadModule,而是依赖Include "conf/extra/httpd-xampp.conf";若这行被注释或删了,php_module就不会出现
检查 SetHandler 或 AddHandler 是否生效
模块加载成功 ≠ PHP 能运行。Apache 必须知道“遇到 .php 文件该交给谁”:
- 优先用
SetHandler application/x-httpd-php,放在<filesmatch></filesmatch>块里最稳妥 -
AddType application/x-httpd-php .php是旧写法,仍可用,但需确保后面跟了DirectoryIndex index.php - XAMPP 的
httpd-xampp.conf里必须含SetHandler声明;如果只有AddType或压根没配,就解析失败 - 虚拟主机配置会覆盖全局,检查
<virtualhost></virtualhost>内是否意外清空或禁用了 PHP handler
警惕隐形语法错误和环境错配
很多“模块找不到”其实是 Apache 根本没开始加载——卡在配置解析阶段:
- 配置文件中用了 Word 或网页复制来的弯引号(“”),Apache 只认 ASCII 直引号
";用 VS Code 或记事本重敲引号再试 - 64 位 Apache 加载了 32 位 PHP DLL,或 VC15 编译的模块配了 VC17 的 Apache,会报
undefined symbol;用php -i | grep "Thread Safety\|Architecture"和httpd -V | grep MPM对齐 - SELinux(CentOS/RHEL)下,
libphp.so必须是httpd_modules_t上下文:ls -Z /usr/lib64/httpd/modules/libphp.so,不对就用chcon -t httpd_modules_t - Linux 下用
ldd /path/to/libphp.so | grep "not found"查缺依赖,常见缺失libxml2、libsqlite3
最常被忽略的点:XAMPP 用户改完 httpd.conf 后只点 “Restart”,但实际要先 Stop 再 Start——Restart 不一定重读 httpd-xampp.conf;还有,端口被 Skype、IIS 占着时,Apache 根本起不来,日志里第一行报错才是关键,别只扫最后几行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











