一个开发LAMP服务器上如何运行多个版本的PHP 5.x?


81

我需要使用多个版本的PHP 5.x(例如PHP 5.0.0和PHP 5.2.8)测试我的PHP应用程序。

有没有一种方法可以配置开发LAMP服务器,以便可以使用多个版本的PHP5快速测试应用程序?


您应该可以使用PATH变量,但我不是100%,因此我不会为代表作答
Malfist

如何在ISPConfig 3(Ubuntu 12.10)中使用多个PHP版本(PHP-FPM和FastCGI) -@ hek2mgl:有关开发工具的问题并非没有主题。
2013年

@hakre Agreed,使用FPM可以减少多个版本作为Apache模块加载时相互影响的可能性:)
–Ja͢ck,

@Jack:Argh,不是Apache Module,FCGI;)
hakre

到目前为止,我已经尝试了phpbrewphp-version,但是它们似乎都无法编译PHP。
好屁股

Answers:


17

一种方法是使用mod_php设置您的主要php版本,并通过快速cgi在其他端口(例如81、82、83等)上运行所有其他版本。但是,这不能保证行为完全一致。


32
一个想法:对于PHP 5.2.1,请使用端口10521。对于5.0.0,请使用10500 :)
Wayne,2009年

2
另一种选择是使用CGI(或FastCGI)在不同路径下运行它-即/ cgi500 /,/ cgi528 /,...
Gray Panther

如果您使用Debian并想使用打包,我建议使用debootstrap创建一个可以保存PHP版本的chroot系统,然后在chroot的系统中配置Apache。
Max Tsepkov 2014年

23

使用CentOS,您可以将fastcgi用于一个PHP版本,将php-fpm用于另一个版本,如下所述:

https://web.archive.org/web/20130707085630/http://linuxplayer.org/2011/05/intall-multiple-version-of-php-on-one-server

基于CentOS 5.6,仅适用于Apache

1.启用rpmforge和epel yum存储库

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
sudo rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
sudo rpm -ivh epel-release-5-4.noarch.rpm

2.安装php-5.1

CentOS / RHEL 5.x系列的包装盒中包含php-5.1,只需与yum一起安装即可,例如:

sudo yum install php php-mysql php-mbstring php-mcrypt

3.从源代码编译并安装php 5.2和5.3

对于php 5.2和5.3,我们可以在Internet上找到许多rpm软件包。但是,它们都与CentOS附带的php冲突,因此,我们最好从纯的角度构建和安装它们,这并不困难,关键是要在其他位置安装php。

但是,当将php作为apache模块安装时,我们只能同时使用一个版本的php。例如,如果我们需要在同一台服务器上同时运行不同版本的php,则不同的虚拟主机可能需要不同版本的php。幸运的是,很棒的FastCGI和PHP-FPM可以提供帮助。

在启用fastcgi的情况下构建并安装php-5.2

1)安装所需的开发包

yum install gcc libxml2-devel bzip2-devel zlib-devel \
    curl-devel libmcrypt-devel libjpeg-devel \
    libpng-devel gd-devel mysql-devel

2)编译安装

wget http://cn.php.net/get/php-5.2.17.tar.bz2/from/this/mirror
tar -xjf php-5.2.17.tar.bz2
cd php-5.2.17
./configure --prefix=/usr/local/php52 \
    --with-config-file-path=/etc/php52 \
    --with-config-file-scan-dir=/etc/php52/php.d \
    --with-libdir=lib64 \
    --with-mysql \
    --with-mysqli \
    --enable-fastcgi \
    --enable-force-cgi-redirect \
    --enable-mbstring \
    --disable-debug \
    --disable-rpath \
    --with-bz2 \
    --with-curl \
    --with-gettext \
    --with-iconv \
    --with-openssl \
    --with-gd \
    --with-mcrypt \
    --with-pcre-regex \
    --with-zlib
make -j4 > /dev/null
sudo make install
sudo mkdir /etc/php52
sudo cp php.ini-recommended /etc/php52/php.ini

3)创建一个fastcgi包装器脚本

创建文件/usr/local/php52/bin/fcgiwrapper.sh

#!/bin/bash
PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS
exec /usr/local/php52/bin/php-cgi
chmod a+x /usr/local/php52/bin/fcgiwrapper.sh
Build and install php-5.3 with fpm enabled

wget http://cn.php.net/get/php-5.3.6.tar.bz2/from/this/mirror
tar -xjf php-5.3.6.tar.bz2 
cd php-5.3.6
./configure --prefix=/usr/local/php53 \
    --with-config-file-path=/etc/php53 \
    --with-config-file-scan-dir=/etc/php53/php.d \
    --enable-fpm \
    --with-fpm-user=apache \
    --with-fpm-group=apache \
    --with-libdir=lib64 \
    --with-mysql \
    --with-mysqli \
    --enable-mbstring \
    --disable-debug \
    --disable-rpath \
    --with-bz2 \
    --with-curl \
    --with-gettext \
    --with-iconv \
    --with-openssl \
    --with-gd \
    --with-mcrypt \
    --with-pcre-regex \
    --with-zlib 

make -j4 && sudo make install
sudo mkdir /etc/php53
sudo cp php.ini-production /etc/php53/php.ini

sed -i -e 's#php_fpm_CONF=\${prefix}/etc/php-fpm.conf#php_fpm_CONF=/etc/php53/php-fpm.conf#' \
    sapi/fpm/init.d.php-fpm
sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
sudo chmod a+x /etc/init.d/php-fpm
sudo /sbin/chkconfig --add php-fpm
sudo /sbin/chkconfig php-fpm on

sudo cp sapi/fpm/php-fpm.conf /etc/php53/

配置php-fpm

编辑/etc/php53/php-fpm.conf,更改一些设置。此步骤主要是取消注释某些设置,您可以根据需要调整该值。

pid = run/php-fpm.pid
listen = 127.0.0.1:9000
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

然后,启动fpm

sudo /etc/init.d/php-fpm start

安装和设置mod_fastcgi,mod_fcgid

sudo yum install libtool httpd-devel apr-devel
wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
tar -xzf mod_fastcgi-current.tar.gz
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
sudo make top_dir=/usr/lib64/httpd/ install
sudo sh -c "echo 'LoadModule fastcgi_module modules/mod_fastcgi.so' > /etc/httpd/conf.d/mod_fastcgi.conf"
yum install mod_fcgid

设置和测试虚拟主机

1)将以下行添加到/ etc / hosts

127.0.0.1 web1.example.com web2.example.com web3.example.com

2)创建Web文档根目录,并在其下放下index.php以显示phpinfo切换到用户root,运行

mkdir /var/www/fcgi-bin
for i in {1..3}; do
    web_root=/var/www/web$i
    mkdir $web_root
    echo "<?php phpinfo(); ?>" > $web_root/index.php
done

注意:必须为空的/ var / www / fcgi-bin目录,请勿稍后删除

3)创建Apache配置文件(附加到httpd.conf)

NameVirtualHost *:80

# module settings
# mod_fcgid
<IfModule mod_fcgid.c>
        idletimeout 3600
        processlifetime 7200
        maxprocesscount 17
        maxrequestsperprocess 16
        ipcconnecttimeout 60 
        ipccommtimeout 90
</IfModule>
# mod_fastcgi with php-fpm
<IfModule mod_fastcgi.c>
        FastCgiExternalServer /var/www/fcgi-bin/php-fpm -host 127.0.0.1:9000
</IfModule>


# virtual hosts...

#################################################################
#1st virtual host, use mod_php, run php-5.1
#################################################################
<VirtualHost *:80>
        ServerName web1.example.com
        DocumentRoot "/var/www/web1"

        <ifmodule mod_php5.c>
                <FilesMatch \.php$>
                        AddHandler php5-script .php
                </FilesMatch>
        </IfModule>

        <Directory "/var/www/web1">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>
#################################################################
#2nd virtual host, use mod_fcgid, run php-5.2
#################################################################
<VirtualHost *:80>
        ServerName web2.example.com
        DocumentRoot "/var/www/web2"

        <IfModule mod_fcgid.c>
                AddHandler fcgid-script .php
                FCGIWrapper /usr/local/php52/bin/fcgiwrapper.sh
        </IfModule>

        <Directory "/var/www/web2">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks +ExecCGI
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>
#################################################################
#3rd virtual host, use mod_fastcgi + php-fpm, run php-5.3
#################################################################
<VirtualHost *:80>
        ServerName web3.example.com
        DocumentRoot "/var/www/web3"


        <IfModule mod_fastcgi.c>
                ScriptAlias /fcgi-bin/ /var/www/fcgi-bin/
                AddHandler php5-fastcgi .php
                Action php5-fastcgi /fcgi-bin/php-fpm
        </IfModule>

        <Directory "/var/www/web3">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks +ExecCGI
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>

4)重启apache。分别访问3个站点,以查看phpinfo并验证结果。即:

http://web1.example.com
http://web2.example.com
http://web3.example.com

如果一切正常,则可以使用3个虚拟主机之一作为模板来创建具有所需php版本的新虚拟主机。


1
但是,这仅是链接的答案。请在答案中包括相关详细信息,而不要完全依赖其他网站。链接具有令人讨厌的问题,即它们可能会消失,因此SO仍然不包含相关信息。
Maarten Bodewes,2014年

您可能希望研究CloudLinux。这是一个付费解决方案,但价格可以接受。
transilvlad15年

1
正确答案!这是适用于Ubuntu的相同解决方案:howtoforge.com/…–
Tobias Gaertner

10

拥有多个apache + php实例从来没有真的让我喜欢过,但这可能是最简单的方法。如果您不喜欢亲吻...这是一个主意。

启动并运行您的apache,并尝试像debian和ubuntu一样配置它,例如,具有用于加载模块的目录。您的apache conf可以使用如下代码:

Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

然后构建您的第一个php版本,并为其添加一个前缀,该前缀应包含明确包含的版本号,例如/usr/local/php/5.2.8、/usr/local/php/5.2.6 ...

conf / load看起来像这样:

php5.2.6.load

LoadModule php5_module /usr/local/php/5.2.6/libphp5.so

php5.2.8.load

LoadModule php5_module /usr/local/php/5.2.8/libphp5.so

要切换版本,您要做的就是从目录apache更改load和conf文件,其他目录的文件包含在apache上。您可以使用简单的bash脚本自动执行该操作(删除实际文件,将备用版本文件复制到位,然后重新启动apache。

这种设置的一个优点是所有内容都是有意义的,因此只要您在选项和模块方面都保持php.ini不变(无论如何,您都必须使用CGI)。他们都在通过SAPI。您的应用程序不需要任何更改,也不需要使用相对URL。

觉得这应该可行,但是话又说回来,我还没有尝试过,也不太可能这样做,因为我没有与您相同的要求。如果您尝试过,请发表评论。


8

注意:以下方法将在Windows上运行。

另一种方法(如果可以一次运行一个PHP版本,则可以)定义多个Apache服务,每个服务将使用不同的PHP版本。

首先在Apache配置文件中使用条件:

 <ifdefine php54>
    SetEnv PHPRC C:/apache/php54/
    ScriptAlias /php/ "C:/apache/php54/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

<ifdefine php55>
    SetEnv PHPRC C:/apache/php55/
    ScriptAlias /php/ "C:/apache/php55/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

现在,使用httpd.exe从命令行创建两个单独的服务(提升为管理员):

httpd.exe -k install -n Apache224_php54 -D php54

httpd.exe -k install -n Apache224_php55 -D php55

现在,您可以一次启动上述服务之一(应先关闭其中一项,再启动另一项服务)。

如果您先前已安装Apache作为服务,则可以使用以下命令删除该服务(将服务名称替换为您使用的服务名称):

apache -k uninstall -n Apache224

还要注意的一点是,我个人使用了一个名为“ Seobiseu”的“通知区域图标程序”来根据需要启动和停止服务。我已经在上面添加了两个服务。


这实际上是一个非常聪明的解决方案。如果要并行运行多个服务,则可以分别在Listen 80Listen 81中包含和ifdefine
caiosm1005 2015年

不错的主意,但问题是关于LAMP服务器,而不是WAMP服务器。
Vinicius Monteiro

4

了解到您可能正在谈论本地/台式计算机,并且可能想继续谈论本地/台式计算机,我将为您提供一个替代方案,以防它可能对您或其他人有所帮助:

在云中设置多个虚拟服务器实例,并在它们之间共享您的代码作为git存储库(或者说,尽管我没有亲身经历,但我个人经验很丰富,您真正需要的只是分散的东西)。这样的好处是可以为您提供尽可能接近的生产体验,并且如果您有安装服务器的经验,那就没那么复杂了(或者昂贵,如果您只想启动服务器,请执行所需的操作,然后再将其降低,那么您说的是几美分,最多可以说50美分,如果您让它继续运行,则要几美元。

如今,我在云中进行所有项目开发,并且发现与使用本地/非虚拟化安装相比,管理基础结构要容易得多,而且这种并排方案相当合理。直截了当。如果您没有考虑,我只是想把这个想法丢掉。


3

我刚刚在Ubuntu 10上从PHP5.3成功降级。

为此,我使用了以下脚本:

#! /bin/sh
php_packages=`dpkg -l | grep php | awk '{print $2}'`

sudo apt-get remove $php_packages

sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/karmic.list

sudo mkdir -p /etc/apt/preferences.d/

for package in $php_packages;
do echo "Package: $package
Pin: release a=karmic
Pin-Priority: 991
" | sudo tee -a /etc/apt/preferences.d/php
done

sudo apt-get update

sudo apt-get install $php_packages

对于不知道如何从命令行运行脚本的任何人,这里有一个简短的教程:

1. cd ~/
2. mkdir bin
3. sudo nano ~/bin/myscriptname.sh
4. paste in the script code I have posted above this
5. ctrl+x (this exits and prompts for you to save)
6. chmod u+x myscriptname.sh

这6个步骤在您的主目录中的名为“ bin”的文件夹中创建一个脚本。然后,您可以通过调用以下命令来运行此脚本:

~/bin/myscriptname.sh

乌利亚!

希望对您有所帮助!

作为参考,这是我获得脚本的地方: 适用于Ubuntu 10的PHP5.2.10

那里有好几个人都在确认这是行得通的,并且对我来说是一种享受。


好的脚本,尽管因果关系对我不起作用,因为我在Power PC上。我只是使用脚本删除了当前安装,然后手动构建了2.14
Jason 2010年

2

创建PHP的Rasmus Lerdorf正在维护一个主动的Vagrant解决方案,该解决方案似乎可以解决您的需求。它允许在PHP版本之间快速切换,目前支持20多个不同版本。它与Nginx服务器一起提供,但可以通过预先配置的设置轻松切换到apache2。它也支持MySQL开箱即用。

这样,您将可以访问所有版本的PHP,这些版本可部署在两个主要的Web服务器上,位于一个不错的游民箱中,该盒子由PHP背后的大个子维护。

欲了解更多信息,我想参考先生的讲话。Lerdorf在https://youtu.be/6XnysJAyThs?t=2864

包含Vagrant解决方案的github存储库位于https://github.com/rlerdorf/php7dev


恕我直言,这可能是“最佳”答案-每个版本使用不同的VM(但是您可以在一个IP地址上运行多个版本吗?)。但是具有讽刺意味的是,PHP的创建者必须这样做-php的最大缺陷必须是版本之间缺乏兼容性,这使得Joomla几乎无用。
EML

0

我的盒子上正在运行几个项目。如果您已经安装了多个版本,则此bash脚本应可帮助您轻松切换。目前,我有php5,php5.6和php7.0,我经常根据正在处理的项目来回切换。这是我的代码。

随时复制。确保您了解代码的工作方式。这是针对webhostin的。我的本地盒子我的mod存放在/ etc / apache2 / mods-enabled /

    #!/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

为了测试,我只是在不同的IP地址上运行了httpd的多个实例,所以我的php7运行在192.168.0.70上,而php5.6运行在192.168.0.56上。在生产环境中,我有一个运行旧版os5.3的oscommerce网站,而该网站只有一个不同的conf文件。

httpd -f /etc/apache2/php70.conf
httpd -f /etc/apache2/php53.conf

php.ini对于不同的站点使用不同的文件也是一种干净的方法。如果您只有两个站点,那么这是一种使事情井井有条的好方法,而您不必担心每次升级时只有一个站点

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.