我想在我的Ubuntu计算机上同时安装PHP 5.2.17和PHP 5.3.5,并根据需要进行切换。我该如何实现?
.php和.php5文件。您还可以将WWW服务器配置为对不同的端口(如http://localhost:80和http://localhost:8080)或不同的域(如http://localphp52和http://localphp53)使用不同的PHP版本,而保留所有剩余的文件夹结构,以便通过更改当前版本轻松地比较在两种环境中运行一个Web应用程序网址。
我想在我的Ubuntu计算机上同时安装PHP 5.2.17和PHP 5.3.5,并根据需要进行切换。我该如何实现?
.php和.php5文件。您还可以将WWW服务器配置为对不同的端口(如http://localhost:80和http://localhost:8080)或不同的域(如http://localphp52和http://localphp53)使用不同的PHP版本,而保留所有剩余的文件夹结构,以便通过更改当前版本轻松地比较在两种环境中运行一个Web应用程序网址。
Answers:
您可以使用php版本管理器来实现。可以使用不同的版本管理器,例如:
我最喜欢的是phpbrew。希望这可以帮助。
您可以一次运行2个不同的PHP版本,但这并不容易获得它们。您需要运行一个单独安装的版本,并根据apache配置中的设置进行配置。
例如,您可以使用fastcgi进行此操作:基本上,您要查找的是在此页面上看到的配置。您可以根据需要的情况/端口/域在配置中添加其他处理程序。安装两个版本后的技巧是此步骤:
===从该页面==
- 最后一步是创建虚拟主机。最后,在/ 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并使用<?了快捷方式,请参见注释)
我安装了php 5.6和7.0,但除了所有提示外,它仍在运行5.6,因此此命令可以节省一天的时间(在我的情况下,我选择选项1并重新启动apache):
sudo update-alternatives --config php
phpinfo()和php -v进行交叉检查很有用,因为它们两者可以具有不同的值。
这对我有用: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。专家提示:如果在输出中看不到它,请一直滚动到输出的顶部,看看那里是否有任何有用的错误消息。
从这篇文章中,我只是按顺序整理了命令,并按顺序解释了我的服务(Ubuntu 12.04)
该方法为您提供:
带菜单的脚本,允许在已安装的php版本之间进行切换(不能同时运行)
服务器上安装的各种PHP版本
分隔的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
问题:
单个apache实例不能同时运行两个不同的PHP版本(至少据我所知)。
无法从软件包中安装两个不同的PHP版本,因为它们会发生冲突(并尝试覆盖相同的目录)。
解:
对于b)从源代码手动编译“另一个” PHP版本(或者,如果您愿意,可以获取适当软件包的源代码并进行修改,以避免冲突并修改安装路径)
对于a)使用不同的模块路径和单独的启动脚本为apache创建单独的一组配置。当然还要在单独的端口上运行它。
VirtualHost我没有在其中添加多个代码,而是在.htaccess文件中添加了以下代码,令人惊讶的是它起作用了,
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
节点:php7.2-fpm在使用代码之前,我已经安装了。
如果要同时运行它们,则需要两个不同的端口。也许您可以使用一个简单的脚本来更改apache配置(httpd.conf),该脚本可以在启动apache之前将一个或另一个版本移到正确的位置。
您还可以与不同的用户一起运行每个网站。更安全。
我曾经用过这种方法。
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
当我处理多个项目时,我遇到了同样的问题。我提到了这篇文章, 但这就像我每次需要切换版本时一样,但这分别为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
可以通过禁用并启用新版本的PHP-
- 切换到旧版本
-a2dismod php7.0
服务apache2重新启动- 切换到新版本
a2enmod php7.0
服务apache2重新启动