Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一台服务器上运行两个PHP版本_Php_Apache - Fatal编程技术网

在同一台服务器上运行两个PHP版本

在同一台服务器上运行两个PHP版本,php,apache,Php,Apache,我在本地服务器上有两个项目,一个项目运行PHP5.6,另一个运行PHP7.0。现在是否可以基于项目启用这两个版本?我已经尝试在一个项目htaccess中添加AddHandler应用程序/x-httpd-php7.php,但它不起作用。目前,服务器上已经安装了PHP7.0和PHP5.6-fpm。下面是phpinfo的屏幕截图 所以在谷歌搜索了一整天之后。我设法在不同的php版本上用FastCgi运行了我的两个项目。多亏了这里的人。我卸载了所有东西,包括Apache,然后重新开始。下面是我用来在本地

我在本地服务器上有两个项目,一个项目运行PHP5.6,另一个运行PHP7.0。现在是否可以基于项目启用这两个版本?我已经尝试在一个项目htaccess中添加
AddHandler应用程序/x-httpd-php7.php
,但它不起作用。目前,服务器上已经安装了PHP7.0和PHP5.6-fpm。下面是phpinfo的屏幕截图


所以在谷歌搜索了一整天之后。我设法在不同的php版本上用FastCgi运行了我的两个项目。多亏了这里的人。我卸载了所有东西,包括Apache,然后重新开始。下面是我用来在本地服务器上启用两个版本的PHP的步骤。顺便说一句,我的电脑是在Linux Mint 18上运行的

  • 假设您已经安装了Apache,为这两个项目创建了虚拟主机,并添加了必要的php PPA。让我们为PHP5.6调用项目
    site56.local
    ,为PHP7.0调用项目
    site70.local
    。通过运行以下命令安装
    php5.6-fpm
    php7.0-fpm

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

    sudo nano /usr/lib/cgi-bin/php56-fcgi
    sudo nano /usr/lib/cgi-bin/php70-fcgi
    
    <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>
    
  • 打开php56 conf文件
    /etc/apache2/conf available/php5.6-fpm.conf
    ,添加此配置并保存:

    sudo nano /usr/lib/cgi-bin/php56-fcgi
    sudo nano /usr/lib/cgi-bin/php70-fcgi
    
    <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>
    
  • 如果安装了php5.6和php5.7,请确保禁用这两个并重新启动apache:

    sudo a2dismod php5.6 php7.0
    sudo systemctl restart apache2
    
  • 在应在php7.0上运行的项目上创建
    .htacces
    文件,并添加此处理程序:

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

  • PS:确保在apache2.conf或httpd.conf中启用htaccess

    site56.local/phpinfo.php:

    site70.local/phpinfo.php:

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

    通过添加以下行

    ProxyPassMatch "^/php70project/.*\.php(/.*)?$" "fcgi://localhost:9070/var/www/" enablereuse=on
    
    在apachevhost配置中,您可以将vhost根/var/www目录php70project中的php版本更改为作为fastcgi运行的版本7

    以下方法用于unix套接字

    ProxyPassMatch "^/php70project/.*\.php(/.*)?$" "unix:/var/run/php70fpm.sock|fcgi://localhost/var/www"
    
    未按预期工作。
    不幸的是,我找不到正确的代码来实现此功能,但由于该页面上没有unix套接字与子文件夹一起使用的示例,因此可能无法实现此功能。

    它不适用于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
    
    此时,您的所有站点都必须使用PHP5.6

    对于需要PHP7的站点,请在vhost中添加此行:

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

    它应该可以做到这一点:)

    我尝试实现Makubex的解决方案,结果成功了。我新安装的灯只有一个问题,那就是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
    
    在这之后,这个解决方案非常有效。
    我从

    中获得了上述两个功能首先,通过运行以下命令确保禁用所有与PHP相关的配置:

    #ls-la/etc/apache2/conf启用| grep php

    #ls-la/etc/apache2/mods启用| 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>
    
    
    ServerName symfony.local
    包括“conf available/php7.2-fpm.conf”
    服务器管理员webmaster@localhost
    DocumentRoot/var/www/symfony.local/curr/public
    允许超越所有
    
    您可以使用.htaccess文件执行此操作

    首先,您需要使用安装所需的FPM

         sudo apt install php7.2-fpm
    
    然后运行下面的命令

          sudo a2enmod actions alias proxy_fcgi fcgid
    
    然后重新启动服务器

       sudo systemctl restart apache
    
    然后在htacess文件中执行以下更改

     <FilesMatch \.php$>
       # Apache 2.4.10+ can proxy to unix socket
          SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
     </FilesMatch>
    
    
    #Apache 2.4.10+可以代理到unix套接字
    SetHandler“proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
    

    下面是启用PHP5.6时运行PHP7.2的示例

    我们已经在Ubuntu+Nginx上的php中介绍了这一点:

    更改CLI PHP版本

    sudo update-alternatives --set php /usr/bin/php7.2
    
    fastcgi_pass unix:/run/php/php7.2-fpm.sock
    
    更改Web PHP版本

    sudo update-alternatives --set php /usr/bin/php7.2
    
    fastcgi_pass unix:/run/php/php7.2-fpm.sock
    

    其中,php7.2可以由您选择的PHP版本取代。

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

    从源代码构建您的2个PHP版本。您必须在modules目录中指定libphp7.so和libphp5.so。只需为每个文件运行一个单独的httpd.conf文件。我跑了5年和7年:

    httpd-php7.conf
    httpd-php5.conf
    

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

    apache目录中启用的
    mod
    的输出是什么?您确定在那里同时启用了php5.x和php7.0x吗?thisHi@HassanAhmed,仅启用php7.0和php5.6-fpm。当我启用php5.6时,apache崩溃了。也许它不知道应该得到什么版本。看看Docker看看这个非常好地解释了debian/apache的答案如果你想用php5.5.9而不是php5.6,那么你还需要安装php5 fpm,php5-fpm.conf文件的内容应该与此链接中的内容相同:我还必须运行
    sudo apt get install php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml
    ,正如公认的答案中所述,我不知道您是否一步一步地正确尝试了解决方案,因为我在启用php5.6-fpm conf
    后重新启动Apache时遇到了这个错误,别名接受1-2个参数,fakename和realname,或者某个位置的realname
    这真是太棒了!但我需要