不能在 httpd-vhosts.conf 的 VirtualHost 中配置 PHPIniDir,因为该指令和 LoadModule php_module 是全局指令,仅允许在服务器级(如 httpd.conf)出现一次;在虚拟主机中使用会报错,必须改用 mod_fcgid + FcgidWrapper 实现 per-vhost 多版本 PHP。

为什么不能直接在 httpd-vhosts.conf 里写 PHPIniDir
因为 Apache 的 PHPIniDir 和 LoadModule php_module 指令是**全局生效**的,只允许出现一次。你在 <VirtualHost> 块里加这些指令,Apache 启动时会直接报错:Invalid command 'PHPIniDir', perhaps misspelled or defined by a module not included in the server configuration。这不是配置顺序问题,而是模块设计限制——mod_php 是服务器级模块,不支持 per-vhost 切换。
必须用 FastCGI 模式(mod_fcgid)才能按站点分 PHP 版本
核心思路是绕过 Apache 内置的 mod_php,改用外部 CGI 进程管理不同 PHP 版本的 php-cgi.exe。每个虚拟主机绑定一个独立的 ScriptAlias 和 FcgidWrapper,由 Apache 把请求转发给对应版本的 CGI 进程。
- 先启用
mod_fcgid:在httpd.conf中取消注释这一行:LoadModule fcgid_module modules/mod_fcgid.so - 添加基础配置(放在
httpd.conf末尾):<IfModule fcgid_module> FcgidInitialEnv PHPRC "C:/xampp/php74" FcgidMaxRequestsPerProcess 1000 FcgidMaxProcesses 50 FcgidIOTimeout 60 FcgidIdleTimeout 60 </IfModule> - 为每个站点单独配置 wrapper 路径,例如 PHP 7.4 站点:
<VirtualHost *:80> ServerName site74.local DocumentRoot "C:/xampp/htdocs/site74" <Directory "C:/xampp/htdocs/site74"> Options Indexes FollowSymLinks ExecCGI AllowOverride All Require all granted AddHandler fcgid-script .php FcgidWrapper "C:/php/php-7.4.33/php-cgi.exe" .php </Directory> </VirtualHost> - 对应 PHP 8.2 站点就换路径:
FcgidWrapper "C:/php/php-8.2.12/php-cgi.exe" .php - 别忘了在
C:\Windows\System32\drivers\etc\hosts加解析:127.0.0.1 site74.local site82.local
PHP 二进制包必须匹配 Apache 的 VC 和线程模型
Windows 下出错最常见原因不是配置,而是二进制不兼容。XAMPP 2025 年后默认用 VC16 编译的 Apache,所以你下载的 PHP 必须是:Thread Safe (TS) + VC16 + x64(与你的 XAMPP 架构一致)。从 windows.php.net/downloads/releases/ 下载时看清楚文件名,比如 php-8.2.12-Win32-vs16-x64.zip 才能用;vc15 或 Non-Thread Safe (NTS) 版本会启动失败,错误日志里常出现 Cannot load module 或 entry point not found。
- 解压后必须复制一份
php.ini到该目录(用php.ini-development改名即可) -
php-cgi.exe所在目录要确保有完整扩展 DLL(如php_mysqli.dll),否则运行时报undefined function mysqli_connect - 如果某个站点提示
Primary script unknown,大概率是FcgidWrapper路径写错了,或php-cgi.exe权限被系统拦截(右键属性 → 解除锁定)
CLI 和 Web 的 PHP 版本是两套体系,别混着切
上面所有配置只影响 Apache 处理 HTTP 请求时的 PHP 版本。你在命令行敲 php -v 或运行 composer install,走的是系统 PATH 里的 php.exe,和 Web 完全无关。想让终端也切版本,得另配脚本或改环境变量 —— 但千万别直接改系统 PATH,否则 Composer 可能因扩展缺失而崩溃。更稳妥的做法是:每个项目根目录放一个 .php-version 文件,再用工具(如 phpenv 或自写批处理)读取并临时注入 PATH。
立即学习“PHP免费学习笔记(深入)”;
真正容易被忽略的是:不同 PHP 版本的扩展 ABI 不兼容。比如你在 PHP 8.2 下编译的 sqlsrv 扩展,绝对不能扔进 PHP 7.4 目录里用 —— 即使文件存在,Apache 启动时也不会加载,也不会报错,只会静默跳过。确认方式是访问 phpinfo() 页面,看 Loaded Extensions 列表是否真包含你要的扩展名。



















