返回

Windows 上 Apache 虚拟主机不同 PHP 版本配置指南

windows

为不同的虚拟主机配置 Apache 的 PHP 设置

作为一名经验丰富的程序员和技术作家,我想分享一个解决方案,帮助你在 Windows 上为 Apache 配置不同的虚拟主机,每个虚拟主机使用不同的 PHP 版本。本文将深入探讨问题、解决方法以及相关内容,为你的项目提供宝贵的见解。

问题

在 Windows 上为 Apache 配置不同的虚拟主机,使其使用不同的 PHP 版本是一项常见的挑战。默认情况下,所有虚拟主机都使用相同的 PHP 版本,这可能会导致应用程序不兼容和性能问题。

解决方法

为了解决这个问题,你需要修改 Apache 配置文件 httpd.config。具体步骤如下:

  • 加载 PHP 模块: 加载所需的 PHP 模块。对于不同的 PHP 版本,使用相应的路径。

  • 设置 PHP 设置: 在每个虚拟主机的 块中,设置 PHPIniDir 指令以指定 PHP 配置目录。

  • 配置虚拟主机: 为需要不同 PHP 版本的虚拟主机添加额外的配置,包括 块以指定要使用的 PHP CGI 可执行文件。

详细步骤

  1. 在 httpd.config 中加载 PHP 模块:
LoadModule php7_module "C:/amp/php74/php7apache2_4.dll"
  1. 为虚拟主机设置 PHP 设置:
<IfModule php_module>
    AddType application/x-httpd-php .php
    DirectoryIndex index.php index.html
    PHPIniDir "C:/amp/php8"
</IfModule>
  1. 配置虚拟主机:
<VirtualHost *:80> 
    ServerName domain1.localhost
    DocumentRoot "D:/wwwroot/domain1/web"
    <Directory "D:/wwwroot/domain1/web">
        Require all granted
        AllowOverride All
    </Directory> 
    <FilesMatch \.php
<VirtualHost *:80> 
    ServerName domain1.localhost
    DocumentRoot "D:/wwwroot/domain1/web"
    <Directory "D:/wwwroot/domain1/web">
        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>
gt;
SetHandler application/x-httpd-php Action application/x-httpd-php "C:/amp/php74/php-cgi.exe" </FilesMatch> </VirtualHost>

示例

LoadModule php7_module "C:/amp/php74/php7apache2_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> 
    <FilesMatch \.php
LoadModule php7_module "C:/amp/php74/php7apache2_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> 
    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
        Action application/x-httpd-php "C:/amp/php74/php-cgi.exe"
    </FilesMatch>
</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>
gt;
SetHandler application/x-httpd-php Action application/x-httpd-php "C:/amp/php74/php-cgi.exe" </FilesMatch> </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
LoadModule php7_module "C:/amp/php74/php7apache2_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> 
    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
        Action application/x-httpd-php "C:/amp/php74/php-cgi.exe"
    </FilesMatch>
</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>
gt;
SetHandler application/x-httpd-php Action application/x-httpd-php "C:/amp/php74/php-cgi.exe" </FilesMatch> </VirtualHost>

这将使 domain1.localhost 使用 PHP 8.1,而 domain2.localhost 使用 PHP 7.4。

结论

通过遵循这些步骤,你可以轻松地为 Windows 上的 Apache 配置不同的虚拟主机,每个虚拟主机使用不同的 PHP 版本。这将为你提供所需的灵活性,以使用最佳的 PHP 版本满足应用程序的需求。

常见问题解答

1. 如何知道正在使用的 PHP 版本?

在虚拟主机的文档根目录中创建一个 info.php 文件,其中包含以下代码:

<?php
    phpinfo();
?>

然后在浏览器中访问 info.php 文件以查看 PHP 版本信息。

2. 如何加载多个 PHP 模块?

在 httpd.config 中使用多个 LoadModule 指令来加载多个 PHP 模块。

3. 如何为特定的文件类型设置不同的 PHP 版本?

使用 块并指定文件扩展名。

4. 如何在虚拟主机上启用 PHP 错误日志记录?

在虚拟主机块中添加以下行:

CustomLog "|C:/apache24/bin/php-cgi.exe -q -l 9 -f \"D:/wwwroot/domain1/web/error_log.txt\""

5. 如何切换到不同的 PHP 版本?

修改 PHPIniDir 指令以指向所需的 PHP 配置目录。