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

我希望在我的Ubuntu机器上安装PHP 5.2.17和PHP 5.3.5并根据我的需要进行切换。 我怎样才能做到这一点?

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

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

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

例如,您可以使用fastcgi执行此操作:基本上您要查找的是您在此页面上看到的配置。 您可以根据所需的情境/端口/域在配置中添加不同的处理程序。 安装两个版本后的诀窍是这一步:

===从那个页面==

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

默认:

   ServerName localhost DocumentRoot /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   

php5.3.17:

   ServerName 5317.localhost DocumentRoot /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   

php5.4.7:

   ServerName 547.localhost DocumentRoot /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   

请参阅完整安装链接问题 。 不要忘记查看标题中的两个链接,它们看起来很漂亮(但压缩程度较低)。 这和那个

(不要被链接的问题是一个没有被接受的答案的大问题。这个方法应该(并且确实)工作正常,但是用户忘了使用并使用 with shorttags off,看评论)

我安装了PHP 5.6和7.0,但除了所有提示它一直运行5.6,所以这个命令保存了一天(在我的情况下我chosse选项1并重新启动apache):

 sudo update-alternatives --config php 

这个对我有用 : 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软件包,但我没有卸载任何东西,我只是想让它在我要求安装新版本时解决它想做的事情:

 sudo apt-get install php5.6 php7.0 

这导致很多抱怨来自apt和许多冲突。 第一个建议的解决方案是删除所有库存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-升级到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输出的模块列表中看到它。 专业提示:如果您在输出中没有看到它,请一直滚动到输出顶部,看看是否有任何有用的错误消息。

从这篇文章中 ,我按顺序排列命令并按顺序解释(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 

问题:

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

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

解:

  • b)从源代码手动编译“其他”PHP版本(或者如果您愿意,可以获取相应软件包的源代码并修改它以避免冲突并修改安装路径)

  • a)为具有不同模块路径和单独启动脚本的apache创建单独的配置集。 当然,在单独的端口上运行它。

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

您还可以使用diferentes用户运行每个网站。 更安全。

我曾经使用过这种方法。

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

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

将需要运行多个php-fpms并设置apache以互相使用。

我写了一个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 

而不是制作多个VirtualHost我只是在我的.htaccess文件中添加以下代码,令人惊讶的是它有效,

  SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"  

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

当我处理多个项目时,我遇到了同样的问题。 我引用了这篇文章但是就像每次我需要在需要时切换版本一样,这样就可以分别为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