我需要使用多个版本的 PHP 5.x 测试我的 PHP 应用程序,例如 PHP 5.0.0 和 PHP 5.2.8。
有没有一种方法可以配置开发 LAMP 服务器,以便我可以使用多个版本的 PHP5 快速测试应用程序?
在 CentOS 中,您可以将 fastcgi 用于一个 PHP 版本,将 php-fpm 用于另一个版本,如下所述:
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
CentOS/RHEL 5.x 系列自带 php-5.1,只需用 yum 安装即可,例如:
sudo yum install php php-mysql php-mbstring php-mcrypt
对于 php 5.2 和 5.3,我们可以在网上找到很多 rpm 包。但是,它们都与CentOS自带的php冲突,所以,我们最好从源头构建和安装,这并不难,关键是将php安装在不同的位置。
但是,当将 php 作为 apache 模块安装时,我们只能同时使用一个版本的 php。如果我们需要在同一台服务器上同时运行不同版本的php,例如不同的虚拟主机可能需要不同版本的php。幸运的是,很酷的 FastCGI 和 PHP-FPM 可以提供帮助。
在启用 fastcgi 的情况下构建和安装 php-5.2
yum install gcc libxml2-devel bzip2-devel zlib-devel \
curl-devel libmcrypt-devel libjpeg-devel \
libpng-devel gd-devel mysql-devel
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
创建文件/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切换到用户根目录,运行
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)重启阿帕奇。分别访问 3 个站点以查看 phpinfo 并验证结果。IE:
http://web1.example.com
http://web2.example.com
http://web3.example.com
如果一切正常,您可以使用 3 个虚拟主机之一作为模板来创建具有所需 php 版本的新虚拟主机。
一种方法是使用 mod_php 设置您的 php 主版本,并通过不同端口(即 81、82、83 等)上的快速 cgi 运行所有其他版本。但是,这并不能保证完全一致的行为。
拥有多个 apache + php 实例从来没有真正让我喜欢,但这可能是最简单的方法。如果你不喜欢 KISS……这里有个主意。
让你的 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 为另一个版本的包含打开。您可以使用简单的 bash 脚本自动执行此操作(删除实际文件,复制备用版本文件,然后重新启动 apache.
这种设置的一个优点是一切都是一致的,只要您在选项和模块方面保持 php.ini 相同(无论如何您都必须使用 CGI)。他们都在通过SAPI。您的应用程序不需要任何更改,也不需要使用相对 URL。
我认为这应该可行,但话又说回来,我没有尝试过,也不太可能这样做,因为我没有与您相同的要求。如果您尝试过,请发表评论。
注意:以下方法适用于 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”的“通知区域图标程序”来根据需要启动和停止服务。我已将上述两项服务添加到其中。
了解到您可能正在谈论本地/桌面机器并且可能想继续谈论本地/桌面机器,我会为您提供一个替代方案,以防万一它可能对您或其他人有所帮助:
在云中设置多个虚拟服务器实例,并在它们之间共享您的代码作为 git 存储库(或 mercurial,我想,虽然我没有个人经验,但您真正需要的是去中心化的东西)。这样做的好处是让您尽可能接近生产体验,如果您有设置服务器的经验,那么它并不那么复杂(或昂贵,如果您只是想启动服务器,做您需要做的事情,然后再把它转下来,然后你说的是几美分,最多说 50 美分,如果你让它继续运行,最多可以赚几美元)。
这些天,我在云中进行所有项目开发,我发现管理基础架构比使用本地/非虚拟化安装时要简单得多,并且它使这种并行场景相当直截了当。如果你没有考虑过,我只是想把这个想法扔出去。
我刚刚在 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
欧利亚!
希望这对你们中的一些人有所帮助!
作为参考,这里是我得到脚本的地方: PHP5.2.10 for Ubuntu 10
那里有几个人都确认这是可行的,这对我来说是一种享受。
创建 PHP 的 Rasmus Lerdorf 正在维护一个活跃的 Vagrant 解决方案,似乎可以解决您的需求。它允许在 PHP 版本之间快速切换,目前支持 20 多个不同的版本。它带有 nginx 服务器,开箱即用,但可以通过预先配置的设置轻松切换到 apache2。它还支持开箱即用的 MySQL。
这样,您将可以访问所有版本的 PHP,可部署在两个主要的 Web 服务器上,在一个漂亮的 vagrant box 中,由 PHP 背后的大人物维护。
欲了解更多信息,我想参考先生的演讲。勒多夫在https://youtu.be/6XnysJAyThs?t=2864
包含 Vagrant 解决方案的 github 存储库位于https://github.com/rlerdorf/php7dev
为了测试,我只是在不同的 IP 地址上运行多个 httpd 实例,所以我在 192.168.0.70 上运行 php7,在 192.168.0.56 上运行 php5.6。在生产中,我有一个运行 php5.3 的旧 oscommerce 的站点,而我只有一个不同的 conf 文件用于该站点
httpd -f /etc/apache2/php70.conf
httpd -f /etc/apache2/php53.conf
php.ini
这也是一种为不同站点提供不同文件的干净方式。如果您只有几个站点,如果这是一种保持事物井井有条的好方法,并且您在升级某些东西时不必担心一次超过 1 个站点
我的盒子上有几个项目正在运行。如果您已经安装了多个版本,这个 bash 脚本应该可以帮助您轻松切换。目前我有 php5、php5.6 和 php7.0,我经常根据我正在从事的项目来回切换。这是我的代码。
随意复制。确保您了解代码的工作原理。这是针对 webhostin 的。我的本地盒子我的模组存储在 /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