我正在 Apache 2.4 / Windows 10 的 httpd.config 中测试不同的语法,以便为不同的虚拟主机提供不同的 php 版本。 Domain1 应运行 PHP 8.1,Domain2 应运行 PHP 7.4。 这是我的测试之一: 有时用线
LoadModule php7_module "C:/amp/php74/php7apache2_4.dll"
有时没有它。 我收到不同的错误。 此版本适用于域 1,但不适用于需要 7.4 的域 2。
#LoadModule php7_module "C:/amp/php74/php7apache2_4.dll"
LoadModule php_module "C:/amp/php8/php8apache2_4.dll"
<IfModule php_module>
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html
PHPIniDir "C:/amp/php8"
</IfModule>
<VirtualHost *:80>
ServerName localhost
DocumentRoot "D:/wwwroot"
<Directory "D:/wwwroot">
Require all granted
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName domain1.localhost
DocumentRoot "D:/wwwroot/domain1/web"
ErrorLog "logs/domain1-error.log"
<Directory "D:/wwwroot/domain1/web">
Require all granted
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName domain2.localhost
DocumentRoot "D:/wwwroot/domain2"
ErrorLog "logs/domain2-error.log"
<Directory "D:/wwwroot/domain2">
Require all granted
AllowOverride All
</Directory>
<FilesMatch \.php$>
SetHandler application/x-httpd-php
Action application/x-httpd-php "C:/amp/php74/php-cgi.exe"
</FilesMatch>
</VirtualHost>
正确的语法是什么?
mod_rewrite
与一个特定的 PHP 版本绑定,并且只能加载一个实例,因此无法同时拥有不同的 PHP 版本。如果更改 LoadModule
指令并重新启动 Apache(有第三方捆绑包可以编写此脚本),则可以在版本之间切换,或者您可以安装侦听不同 IP+端口组合的 Apache 的另一个副本。
另一种选择是并排安装不同的 SAPI 模块(或替换)
mod_php
,例如 mod_fcgid。为此:
根据需要下载任意数量的 PHP 版本并将它们安装在不同的目录中。
如果您还没有该模块,请获取该模块。 Apache Lounge 提供 Windows 二进制文件。
使用您认为合适的任何系统范围默认值加载模块:
LoadModule fcgid_module C:/path/to/mod_fcgid.so
FcgidInitialEnv PHPRC "C:/PHP74"
FcgidWrapper "C:/PHP74/php-cgi.exe" .php
对于您想要不同 PHP 版本的每个虚拟主机,请将
mod_php
替换为 mod_fcgid
:
<VirtualHost *:443>
ServerName legacy.example.com
# ...
Options +ExecCGI
<FilesMatch \.php$>
SetHandler fcgid-script
</FilesMatch>
</VirtualHost>
如果你完全放弃了
mod_php
,你也可以这样做:
Options +ExecCGI
<FilesMatch \.php$>
AddHandler fcgid-script .php
</FilesMatch>
如果您需要另一个 PHP 版本,请在所需的虚拟主机中设置不同的解释器:
<VirtualHost *:443>
ServerName latest.example.com
# ...
Options +ExecCGI
<FilesMatch \.php$>
SetHandler fcgid-script
</FilesMatch>
FcgidInitialEnv PHPRC "C:/PHP83"
FcgidWrapper "C:/PHP83/php-cgi.exe" .php
</VirtualHost>
如果您在
.htaccess
或其他 Apache 设置文件(php_flag
、php_value
等)中设置 PHP 指令,则需要将它们迁移到 .user.ini
文件中(使用适当的语法) .
相对于其他解决方案的好处是您不需要切换,所有项目将同时使用它们需要的 PHP 版本。
注意:这是针对 Windows 编写的。在 Linux 上,您可能更喜欢 php-fpm。