关键是在虚拟主机配置中按站点绑定指定PHP版本:mod_php用SetHandler指向对应模块(如application/x-httpd-php8.3),php-fpm则通过ProxyPassMatch或SetHandler代理至独立FPM池socket,需确保对应PHP版本已安装、模块已加载、handler名匹配,并用phpinfo()验证。

要让 Apache 的某个虚拟主机用指定 PHP 版本,关键不是全局切换,而是按站点精准绑定。不同站点可共存不同 PHP 版本,比如 site-a.test 用 PHP 8.3,site-b.test 用 PHP 8.5,互不影响。
确认多个 PHP 版本已安装并可用
先在终端执行:
php -v # 查看默认版本(通常不影响虚拟主机) php8.3 -v # 检查 PHP 8.3 是否存在(Linux/macOS 常见) ls /usr/lib/apache2/modules/libphp8.5.so # Ubuntu/Debian 下模块路径示例 ls /opt/homebrew/lib/httpd/modules/libphp8.3.so # macOS Homebrew 路径示例
Windows 用户需确认 php8apache2_4.dll 等文件已放在对应 PHP 目录中,且名称与 Apache 和 PHP 大版本匹配(如 PHP 8.5 + Apache 2.4 → php8apache2_4.dll)。
Apache 配置虚拟主机时指定 PHP 版本
取决于你用的是 mod_php(嵌入式)还是 php-fpm(推荐),方法不同:
-
用 mod_php(简单测试场景)
在内添加SetHandler,指向对应版本的处理器:<virtualhost> ServerName site-a.test DocumentRoot "/var/www/site-a" <filesmatch> SetHandler application/x-httpd-php8.3 </filesmatch><directory> AllowOverride All Require all granted </directory></virtualhost>✅ 前提:Apache 已加载对应模块(如
LoadModule php8_module modules/libphp8.3.so)
❌ 注意:application/x-httpd-php8.3这个 handler 名称必须与模块注册名一致,可通过httpd -M | grep php查看实际加载的模块名。 -
用 php-fpm(生产环境首选)
每个站点配独立 FPM pool,每个 pool 加载自己的php.ini和 PHP 版本:-
编辑 FPM pool 配置(如
/etc/php/8.5/fpm/pool.d/site-a.conf):[site-a] listen = /run/php/php8.5-site-a.sock php_admin_value[extension_dir] = /usr/lib/php/8.5/extensions/ php_admin_value[error_log] = /var/log/php8.5-site-a.log
-
Apache 虚拟主机中代理到该 sock:
<virtualhost> ServerName site-b.test DocumentRoot "/var/www/site-b" <filesmatch> SetHandler "proxy:unix:/run/php/php8.5-site-a.sock|fcgi://localhost" </filesmatch><directory> AllowOverride All Require all granted </directory></virtualhost>
-
验证是否生效
在对应站点根目录放一个 info.php:
<?php phpinfo(); ?>
访问 http://site-a.test/info.php,页面顶部明确显示 PHP Version 8.3.x,且 “Server API” 显示为 “Apache 2.0 Handler”(mod_php)或 “FPM/FastCGI”(php-fpm),即成功。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











