apache执行php必须明确配置运行模式,否则.php文件会被下载或404;三种互不兼容模式为:1.模块模式(loadmodule+addtype),php嵌入apache;2.cgi模式(action+scriptalias),每次请求启动新进程;3.fastcgi/php-fpm模式(proxypassmatch或mod_fcgid),推荐生产环境使用。

Apache 执行 PHP 脚本不是“自动发生的”,必须明确配置 Apache 使用哪种 PHP 运行模式,否则 .php 文件会被当作纯文本下载或直接 404 —— 这是最常见的根本原因。
确认你用的是哪种 PHP 运行模式
Apache 支持三种 PHP 执行方式:模块模式(mod_php)、CGI 模式、FastCGI(常由 php-fpm 提供)。它们互不兼容,配置项完全不同,混用会导致 500 错误或脚本不解析。
- 模块模式(
LoadModule php_module):PHP 作为 Apache 的一部分加载,php.ini生效范围受httpd.conf或.htaccess中php_flag影响,但仅限 Apache 模块版可用;apache_setenv()、apache_get_version()等函数仅在此模式下有效 - CGI 模式(
Action application/x-httpd-php):每次请求都 fork 一个php-cgi.exe(Windows)或php-cgi(Linux),开销大,已基本淘汰;$_SERVER中不会包含 Apache 特有变量(如REDIRECT_STATUS不稳定) - FastCGI / php-fpm 模式(
ProxyPassMatch或Fcgid):推荐生产环境使用;PHP 进程独立于 Apache,php.ini由 php-fpm 配置文件(如www.conf)控制,Apache 仅转发请求;apache_setenv()失效,环境变量需通过SetEnv+passenv显式透传
检查 httpd.conf 是否加载了正确模块并关联 .php 后缀
无论哪种模式,都必须让 Apache 知道“遇到 .php 文件该交给谁处理”。漏掉任一环节都会导致文件被下载而不是执行。
- 模块模式:确保存在
LoadModule php_module modules/libphp.so(Linux)或LoadModule php8_module "c:/php/php8apache2.dll"(Windows),且路径真实存在 - 模块模式:必须有
AddType application/x-httpd-php .php,否则 MIME 类型不匹配,浏览器会下载源码 - FastCGI 模式(php-fpm):需启用
mod_proxy_fcgi和mod_proxy,并配置ProxyPassMatch "^/(.*\.php)$" "fcgi://127.0.0.1:9000/var/www/"(路径需与 DocumentRoot 对齐) - CGI 模式:需
ScriptAlias /php/ "/usr/bin/"+Action application/x-httpd-php "/php/php-cgi",注意路径权限 —— Apache 必须能执行该二进制文件
验证 PHP 解析是否真正生效
光看 phpinfo() 页面返回 HTML 不代表一切正常。很多问题只在特定上下文暴露:
- 访问
test.php返回空白页?检查 Apache 错误日志(ErrorLog指向的文件),常见原因是php.ini路径错误(模块模式需PHPIniDir)、或 php-fpm 未运行(systemctl status php-fpm) - 页面显示源码而非执行结果?90% 是
AddType缺失或拼写错误(比如写成application/x-httpd-php-source) - 出现
503 Service Temporarily Unavailable?FastCGI 地址不可达,检查php-fpm.sock权限(Apache 用户需有读写权)或 TCP 端口是否被占用 -
apache_setenv()返回false?说明当前不是模块模式 —— 别在 php-fpm 下试图调用它
权限和上下文陷阱最容易被忽略
尤其是多虚拟主机或容器化部署时,看似配置正确却失败,往往卡在权限或作用域上:
-
php_flag在 Apache 2.x 的<virtualhost></virtualhost>块中可能污染其他站点(尤其magic_quotes_gpc类全局开关),建议统一用.htaccess或在每个<virtualhost></virtualhost>中显式声明默认值 - DocumentRoot 目录对 Apache worker 用户(如
www-data或apache)必须有执行(x)权限,否则无法进入子目录 ——ls -ld /var/www看是否含dr-xr-xr-x中的x - Windows 下若用模块模式,
php5apache2.dll必须从 PHPsapi目录复制,且与 Apache 版本(2.4 vs 2.2)、架构(x64/x86)严格匹配,否则httpd -t校验直接报错 - SELinux 或 AppArmor 启用时,即使文件权限 755,Apache 也可能被禁止执行 PHP 二进制或连接 php-fpm socket —— 临时禁用(
setenforce 0)可快速验证是否为此类问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











