使用 Apache 在同一服务器上运行两个 PHP 版本

问题描述 投票:0回答:8

我本地服务器上有两个项目,一个项目运行PHP5.6,另一个项目运行PHP7.0。现在可以根据项目启用这两个版本吗?我已经尝试在 htaccess 项目之一中添加

AddHandler application/x-httpd-php7 .php
但它不起作用。目前服务器上已经安装了PHP7.0和PHP5.6-fpm。下面是
phpinfo()
的截图。

php apache
8个回答
38
投票

我终于成功地在不同的 PHP 版本上在 FastCGI 中运行了我的两个项目,感谢来自 PHP subreddit 的人们。

我卸载了包括 Apache 在内的所有内容并重新开始。以下是我在本地服务器上启用两个版本的 PHP 所用的步骤。顺便说一句,我的电脑运行的是 Linux Mint 18。

  1. 假设您已经安装了 Apache,为两个项目创建了虚拟主机并添加了必要的 PHP PPA。我们将 PHP 5.6 的项目称为

    site56.local
    ,将 PHP 7.0 的项目称为
    site70.local
    。通过运行安装
    php5.6-fpm
    php7.0-fpm

    sudo apt-get install php5.6-fpm
    sudo apt-get install php7.0-fpm
    
  2. /usr/lib/cgi-bin/
    下创建两个文件(说实话我不知道这一步还有必要吗),然后保存:

    sudo nano /usr/lib/cgi-bin/php56-fcgi
    sudo nano /usr/lib/cgi-bin/php70-fcgi
    
  3. 打开php56 conf文件

    /etc/apache2/conf-available/php5.6-fpm.conf
    ,添加此配置并保存:

    <IfModule mod_fastcgi.c>
        AddHandler php56-fcgi .php
        Action php56-fcgi /php56-fcgi
        Alias /php56-fcgi /usr/lib/cgi-bin/php56-fcgi -socket /var/run/php/php5.6-fpm.sock -pass-header Authorization
        Action php70-fcgi /php70-fcgi
        Alias /php70-fcgi /usr/lib/cgi-bin/php70-fcgi -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization
    </IfModule>
    <Directory /usr/lib/cgi-bin>
        Require all granted
    </Directory>
    
  4. 现在启用新的 Apache 配置:

    sudo a2enconf php5.6-fpm
    
  5. 如果您安装了 php5.6 和 php5.7,请确保禁用这两个并重新启动 Apache:

    sudo a2dismod php5.6 php7.0
    sudo systemctl restart apache2
    
  6. 在应在 php7.0 上运行的项目上创建一个

    .htaccess
    文件并添加此处理程序:

    AddHandler php70-fcgi .php
    
  7. 现在在两个项目上创建一个 phpinfo 文件,如果您看到类似的内容,那么恭喜您!

PS:确保您在

.htaccess
apache2.conf
 中启用 
httpd.conf

site56.local/phpinfo.php

site70.local/phpinfo.php


8
投票

首先,通过运行以下命令确保禁用所有 PHP 相关配置:

# ls -la /etc/apache2/conf-enabled | ls -la /etc/apache2/conf-enabled | grep php

# ls -la /etc/apache2/mods-enabled | grep php

为特定站点设置不同版本的 PHP-FPM:

将以下行添加到现有的 VirtualHost 文件中。

Include "conf-available/php7.2-fpm.conf"

例如,

# vim /etc/apache2/sites-enabled/symfony.local.conf

<VirtualHost *:80>
    ServerName symfony.local

    Include "conf-available/php7.2-fpm.conf"

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/symfony.local/curr/public

    <Directory /var/www/symfony.local/curr/web>
        AllowOverride All
    </Directory>
</VirtualHost>

3
投票

它不适用于 debian 9 Stretch。我花了一段时间才弄清楚该怎么做,但最后我找到了一个看起来更简单的解决方案:

sudo apt-get install php5.6-fpm

sudo apt-get install php7.0-fpm

sudo a2enconf php5.6-fpm

如果您安装了 php5.6 和 php5.7,请确保禁用这两个并重新启动 apache。

sudo a2dismod php5.6 php7.0

sudo systemctl restart apache2

此时您的所有网站都必须在 php 5.6 上运行。

对于需要 php 7 的网站,请在虚拟主机中添加此行:

ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php/php7.0-fpm.sock|fcgi://localhost/path/to/my/main/file"

应该可以解决问题:)


2
投票

我尝试实施 Makubex 的解决方案并且它有效。我在新安装的 LAMP 中只遇到一个问题,那就是 fastcgi 未启用。 我刚刚使用以下脚本再次安装了 php,然后启用了 fastcgi。

sudo apt-get install libapache2-mod-fastcgi php5.6-fpm php5.6 php5.6-dev php5.6-mcrypt php5.6-mbstring php5.6-mysql php5.6-zip php5.6-gd php5.6-xml php7.1-fpm libapache2-mod-fastcgi php7.1-fpm php7.1 php7.1-dev php7.1-mbstring php7.1-mysql php7.1-zip php7.1-gd php7.1-xml php7.1-curl php7.1-intl php7.1-json php7.1-mcrypt

然后:

a2enmod actions
a2enmod fastcgi

此后,解决方案完美运行。 我从在 Ubuntu 16.04 上使用 php-fpm 和 xdebug 在同一服务器上运行多个 PHP 版本

得到了上面的两个

2
投票

我们已经在 Ubuntu + Nginx 上使用 PHP 的情况下解决了这个问题:
https://blog.magepsycho.com/how-to-install-multiple-versions-of-php-on-ubuntu/

更改 CLI PHP 版本

sudo update-alternatives --set php /usr/bin/php7.2

更改 Web PHP 版本

fastcgi_pass unix:/run/php/php7.2-fpm.sock

其中php7.2可以替换为您选择的PHP版本。


1
投票

您可以使用

.htaccess
文件来完成此操作

首先您需要使用

安装所需的FPM
sudo apt install php7.2-fpm

然后运行以下命令

sudo a2enmod actions alias proxy_fcgi fcgid

然后重新启动您的服务器

sudo systemctl restart apache

然后在

.htaccess
文件中进行以下更改

 <FilesMatch \.php$>
   # Apache 2.4.10+ can proxy to unix socket
      SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
 </FilesMatch>

这是启用 PHP 5.6 时运行 PHP 7.2 的示例


0
投票

尝试按照您的指示进行操作后,我发现了一种可能更简单的方法来获得相同的结果。

添加以下行

ProxyPassMatch "^/php70project/.*\.php(/.*)?$" "fcgi://localhost:9070/var/www/" enablereuse=on

在 apache vhost 配置中,您可以将 vhost root /var/www 中的 php70project 目录中的 php 版本更改为以 fastcgi 运行的版本 7。

以下方法与unix套接字一起使用

ProxyPassMatch "^/php70project/.*\.php(/.*)?$" "unix:/var/run/php70fpm.sock|fcgi://localhost/var/www"

未按预期工作。 不幸的是,我找不到正确的代码来使其工作,但由于该页面上没有使用子文件夹的unix套接字的示例https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html它可能只是不可能。


0
投票

所有 linux 软件包的内容使这个过程变得更加混乱,这让这个过程变得更加困难。简单的手动、独立于系统的方式:

从源代码构建 2 个版本的 PHP。您的模块目录中将包含 libphp7.so 和 libphp5.so 。只需为每个运行单独的 httpd.conf 文件即可。我跑了 5 和 7 多年了:

httpd-php7.conf
httpd-php5.conf

然后。只需将无法运行 7 的虚拟主机放入 php5 配置中,然后在启动时手动启动它们或创建 rc.d 文件或系统启动时使用的任何文件。

© www.soinside.com 2019 - 2024. All rights reserved.