如何安装两个版本的PHP并在两个版本之间轻松切换?


76

我想在我的Ubuntu计算机上同时安装PHP 5.2.17和PHP 5.3.5,并根据需要进行切换。我该如何实现?


在ubuntu中,/ etc / apache2中也有apache.conf,我也考虑过这一点,也许将来我会制作一些软件包,这对于Web开发人员来说将非常有用

您可以使用suPHP来执行此操作,无需确定详细信息
Marco Ceppi

1
是否有python virtualenv之类的东西可以进行干净的PHP隔离部署?
lenzai

您是否考虑过使用无头方式使用的虚拟化软件设置虚拟Ubuntu服务器?如果您想要做的事情没有通过这样的设置很好地满足(没有双关语意),我会感到惊讶。
西蒙·霍尔

1
定义“轻松切换”的含义。我用它来工作:我的网络服务器使用了不同的PHP .php.php5文件。您还可以将WWW服务器配置为对不同的端口(如http://localhost:80http://localhost:8080)或不同的域(如http://localphp52http://localphp53)使用不同的PHP版本,而保留所有剩余的文件夹结构,以便通过更改当前版本轻松地比较在两种环境中运行一个Web应用程序网址。
cprn

Answers:


61

您可以使用php版本管理器来实现。可以使用不同的版本管理器,例如:

我最喜欢的是phpbrew。希望这可以帮助。


2
谢谢,您能附上说明吗?(onnu vishadheekarikkamo?)
Tachyons

17
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Nanne

2
只需检查他们在其站点上具有非常好的文档的链接即可。您是否真的要我从他们的网站复制粘贴内容?
aneeshep

7
具有讽刺意味的是,不仅仅发布链接的原因之一是linkrot,此发布现在遭受了痛苦。
MirroredFate 2013年

@aneeshep,而不是复制粘贴他们的文档,而是真正的相关摘录和有关什么是“ php版本管理器”以及如何针对特定问题使用/配置它的几行内容。
Matthieu

20

可以一次运行2个不同的PHP版本,但这并不容易获得它们。您需要运行一个单独安装的版本,并根据apache配置中的设置进行配置。

例如,您可以使用fastcgi进行此操作:基本上,您要查找的是在此页面上看到的配置。您可以根据需要的情况/端口/域在配置中添加其他处理程序。安装两个版本后的技巧是此步骤:

===从该页面==

  1. 最后一步是创建虚拟主机。最后,在/ etc / apache2 / sites-enabled中,我有三个文件:000-default,php5.3.17和php5.4.7,具有以下内容

默认:

    <VirtualHost *:80>
      ServerName localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.3.17:

    <VirtualHost *:80>
      ServerName 5317.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.4.7:

    <VirtualHost *:80>
      ServerName 547.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php547.fcgi
      </Directory>
    </VirtualHost>

有关完整的安装请参见链接的问题。别忘了同时查看标题中的两个链接,它们看起来像不错的教程(但压缩较少)。这个那个

(不要因链接的问题是一个大问题而没有被接受的答案而感到厌烦。该方法应该(并且确实)可以正常工作,但是用户忘记了使用快捷方式<?php并使用<?了快捷方式,请参见注释)


13

我安装了php 5.6和7.0,但除了所有提示外,它仍在运行5.6,因此此命令可以节省一天的时间(在我的情况下,我选择选项1并重新启动apache):

sudo update-alternatives --config php

记住使用情况phpinfo()php -v进行交叉检查很有用,因为它们两者可以具有不同的值。
Adi Prasetyo

6

这对我有用https//lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu

与“咆哮的跳蚤”中的脚本相同,但使用的是新版本。

添加PPA

PHP 5.6和PHP 7.0软件包来自第三方PPA,而Canonical的官方Ubuntu存储库未提供这些软件包。我在这里推荐的PPA来自OndřejSurý,他为Debian打包了PHP(然后由Ubuntu使用),因此虽然它不是官方存储库,但他并不是完全随机的!PPA本身在 这里

要将PPA添加到您的设置中:

sudo add-apt-repository ppa:ondrej/php  

然后,我们还将希望从新的PPA中获取有关所提供内容的信息,然后运行:

sudo apt-get update   

安装新的PHP版本

我已经安装了一些php5软件包,但没有卸载任何东西,当我要求安装新版本时,我让apt弄清楚它想要做什么:

sudo apt-get install php5.6 php7.0

这导致了许多来自于适当性的抱怨和许多冲突。建议的第一个解决方案是删除所有现有的php5软件包,以便可以安装PHP 5.6-所以我刚刚接受了第一个建议。

我使用apache,所以此设置使apache既有可用的php5.6和php7.0模块,又有实际加载的php5.6模块。

除了PHP本身,PHP的所有扩展和其他工具都在这两个版本的PHP中都存在,因此很容易添加所需的模块。我对这项工作的出色表现印象非常深刻。

配置和切换版本

现在,您已经在系统上安装了两个完全独立的PHP版本,下面让我们看一下所有组件的去向!

该配置文件都在/etc/php/5.6,并/etc/php/7.0 分别-里面在这里你可以配置哪些扩展被装载,设置INI设置,以及其他一切在隔离每个版本。

我是一个Apache用户,正如我提到的,两个模块都可用。因此,从一个切换到另一个我需要做:

sudo a2dismod php5.6
sudo a2enmod php7.0
sudo service apache2 restart

对于Nginx用户来说,更改几乎一样容易,Digital Ocean对此有很好的文档(他们确实有出色的文档!),因此请查看他们的指南:https : //www.digitalocean.com/community/tutorials/how-to- upgrade-to-php-7-on-ubuntu-14-04, 因为其中包括有关重新配置nginx以使用另一版本的PHP的部分。

从命令行,我可以同时使用php5.6和php7.0作为命令。我还有一个php命令-在/ etc / alternatives中查看它是否符号链接到特定版本的PHP cli *。您还可以通过运行来快速检查您正在使用哪个php -v

*更具体地说,运行哪个php以查看所使用的PHP版本-但这可能指向/usr/bin/php,这对我来说本身就是该/etc/alternatives/php命令的符号链接。

使用扩展

该PPA随附了常用的php-pear软件包,该软件包为两个版本的PHP提供了pecl命令,因此可以通过常规方式安装可通过PECL获得的任何扩展。您还将需要相关的标头,因此应安装php5.6-dev或php7.0-dev。

当pecl安装完成时,您将获得一条将* .so文件添加到php.ini的说明;实际上,最好的方法是查看其中的内容/etc/php/mods-available。这里已经有一些模块,每个模块都在自己的文件中,以扩展名命名,并以.ini结尾。您可以复制一个用作模板,也可以创建自己的模板,并将扩展的所有相关配置放入其中(至少需要extension=[extensionName].so)。

一旦新的扩展程序在mods中可用,请启用它,然后通过以下操作对其进行检查:

sudo phpenmod extension  
php -m  

这将在正确的位置创建符号链接,以供当前版本的PHP加载此模块,并且您应该在中显示的模块列表中看到它php -m。专家提示:如果在输出中看不到它,请一直滚动到输出的顶部,看看那里是否有任何有用的错误消息。


3

从这篇文章中,我只是按顺序整理了命令,并按顺序解释了我的服务(Ubuntu 12.04)

该方法为您提供:

  1. 带菜单的脚本,允许在已安装的php版本之间进行切换(不能同时运行)

  2. 服务器上安装的各种PHP版本

  3. 分隔的conf文件

安装您需要的所有版本(我有两个)

安装依赖项:

sudo apt-get install flex apache2-threaded-dev libxml2-dev apache2 apache2-mpm-prefork apache2-threaded-dev apache2-utils apache2.2-bin apache2.2-common

第一次安装PHP 5.3。下载php源码

md5sum Downloads/php-5.3.10.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.3.10.tar.bz2 .
tar xjf php-5.3.10.tar.bz2
cd php-5.3.10/
sudo mkdir /usr/local/php/php_5.3.10

第一次安装PHP5.6。下载php源码

md5sum Downloads/php-5.6.11.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.6.11.tar.bz2 .
tar xjf php-5.6.11.tar.bz2
cd php-5.6.11/
sudo mkdir /usr/local/php/php-5.6.11

脚本管理器版本PHP:创建一个名为的文件php.sh并将其放入/bin/

#!/bin/bash
opcion=0
cat << CABECERAMENU
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
CABECERAMENU
echo -n "Ingrese su eleccion: "
read opcion
echo
case $opcion in
    "1")
        rm /etc/apache2/php.conf
        ln -s /usr/local/php/php_5.3.10.conf /etc/apache2/php.conf
        /etc/init.d/apache2 restart
    ;;
    "2")
        rm /etc/apache2/php.conf
        ln -s /usr/local/php/php_5.6.11.conf /etc/apache2/php.conf
        /etc/init.d/apache2 restart
    ;;
    *)
        echo "Opcion no valida"
    ;;
esac

编译并安装php 5.3:

cd ~/Sources/php-5.3.10/
sudo ./configure --prefix=/usr/local/php/php_5.3.10 --with-config-file-path=/usr/local/php/php_5.3.10/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-zip --with-gd --with-curl --with-xmlrpc --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql --with-pdo-pgsql --enable-soap
sudo make clean
sudo make
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/lib/apache2/modules/libphp5.*
sudo make install
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/local/php/php-5.3.10/modules/libphp5.so
sudo mv /usr/lib/apache2/modules/libphp5.so /usr/local/php/php_5.3.10/modules/
ls -lhart /usr/local/php/php_5.3.10/modules/
sudo a2dismod php5
sudo service apache2 restart

编译并安装php 5.6

cd ~/Sources/php-5.6.11
sudo ./configure --prefix=/usr/local/php/php_5.6.11 --with-config-file-path=/usr/local/php/php_5.6.11/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-zip --with-gd --with-curl --with-xmlrpc --enable-calendar --enable-sockets --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql  --with-pdo-pgsql --enable-soap
sudo make clean
sudo make
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/lib/apache2/modules/libphp5.*
sudo make install
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/local/php/php_5.6.11/modules/libphp5.so
sudo mv /usr/lib/apache2/modules/libphp5.so /usr/local/php/php_5.6.11/modules
ls -lhart /usr/local/php/php_5.6.11/modules
sudo a2dismod php5
sudo service apache2 restart

让我们使用它们:

$ sudo php.sh
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
Ingrese su eleccion: 1

 * Restarting web server apache2                                                                                                                                                                                                                                        apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

2

问题:

  1. 单个apache实例不能同时运行两个不同的PHP版本(至少据我所知)。

  2. 无法从软件包中安装两个不同的PHP版本,因为它们会发生冲突(并尝试覆盖相同的目录)。

解:

  • 对于b)从源代码手动编译“另一个” PHP版本(或者,如果您愿意,可以获取适当软件包的源代码并进行修改,以避免冲突并修改安装路径)

  • 对于a)使用不同的模块路径和单独的启动脚本为apache创建单独的一组配置。当然还要在单独的端口上运行它。


有没有预包装的脚本来编译这些多个parallele php实例?只是手动完成并修补路径?因此,这意味着所有托管公司都在那里开发自定义脚本来运行这些并行版本,并且永远不会共享他们的精力。
lenzai 2012年

4
一个apache实例可以一次运行2个php版本。
Nanne

1

VirtualHost我没有在其中添加多个代码,而是在.htaccess文件中添加了以下代码,令人惊讶的是它起作用了,

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
</FilesMatch>

节点:php7.2-fpm在使用代码之前,我已经安装了。


0

如果要同时运行它们,则需要两个不同的端口。也许您可以使用一个简单的脚本来更改apache配置(httpd.conf),该脚本可以在启动apache之前将一个或另一个版本移到正确的位置。


1
我已经安装了PHP 5.3.5。如何安装PHP 5.2.17?您能告诉我在这两个版本之间进行切换时需要更改的位置和内容吗?我的安装中的httpd.conf文件为空。
Debiprasad 2011年

0

您还可以与不同的用户一起运行每个网站。更安全。

我曾经用过这种方法。

http://blog.servergrove.com/2011/08/22/how-to-setup-multiple-php-versions-on-apache/

现在我认为使用php-fpm更好。。。但是配置多个php版本要复杂得多。

将需要运行多个php-fpms并将apache设置为彼此使用。


3
欢迎来到Ask Ubuntu!虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
user98085

我没有时间做你所说的。我想,我只想展示一种方法。Stil需要学习如何使用格式化的东西。不管怎么说,还是要谢谢你!
Henrique Fernandes

0

我写了一个bash脚本,使我可以轻松地在盒子上的已安装php版本之间进行切换。我运行多个虚拟主机是因为我有多个带有新旧程序的客户的Web项目。其中一些项目需要较早版本的php,而其他项目则需要php7.0。

通读我的评论,并确保您在使用此功能之前了解发生了什么。

#!/bin/bash
# This file is for switching php versions.  
# To run this file you must use bash, not sh
# 
# OS: Ubuntu 14.04 but should work on any linux
# Example: bash phpswitch.sh 7.0
# Written by Daniel Pflieger
# growlingflea at g mail dot com

NEWVERSION=$1  #this is the git directory target

#get the active php enabled mod by getting the array of files and store
#it to a variable
VAR=$(ls /etc/apache2/mods-enabled/php*)

#parse the returned variables and get the version of php that is active.
IFS=' ' read -r -a array <<< "$VAR"
array[0]=${array[0]#*php}
array[0]=${array[0]%.conf}


#confirm that the newversion veriable isn't empty.. if it is tell user 
#current version and exit
if [ "$NEWVERSION" = "" ]; then
echo current version is ${array[0]}.  To change version please use argument
exit 1
fi 

OLDVERSION=${array[0]}
#confirm to the user this is what they want to do
echo "Update php"  ${OLDVERSION} to ${NEWVERSION}


#give the user the opportunity to use CTRL-C to exit ot just hit return
read x

#call a2dismod function: this deactivate the current php version
sudo a2dismod php${OLDVERSION}

#call the a2enmod version.  This enables the new mode
sudo a2enmod php${NEWVERSION} 

echo "Restart service??"
read x

#restart apache
sudo service apache2 restart

0

当我处理多个项目时,我遇到了同样的问题。我提到了这篇文章, 但这就像我每次需要切换版本时一样,但这分别为cli和web提供了灵活性。

从php5.6移至php7.0

对于Apache,我们可以使用以下命令:

sudo a2dismod php5.6 ; sudo a2enmod php7.0 ; sudo service apache2 restart

对于CLI,我们可以使用以下命令:

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

从php7.0到php5.6

对于Apache,我们可以使用以下命令:

sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart

对于CLI,我们可以使用以下命令:

sudo update-alternatives --set php /usr/bin/php5.6

尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。- 评分
waltinator

@waltinator感谢您的审查,一定会解决的
Shivdhwaj Pandey

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.