我需要使用多个版本的PHP 5.x测试我的PHP应用程序,例如PHP 5.0.0和PHP 5.2.8.
有没有办法可以配置开发LAMP服务器,以便我可以使用多个版本的PHP5快速测试应用程序?
使用CentOS,你可以使用一个版本的PHP的fastcgi和另一个版本的php-fpm的组合,如下所述:
https://web.archive.org/web/20130707085630/http://linuxplayer.org/2011/05/intall-multiple-version-of-php-on-one-server
基于CentOS 5.6,仅适用于Apachewget 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,我们可以在Internet上找到许多rpm包.但是,它们都与CentOS附带的php冲突,所以,我们最好从soure构建和安装它们,这并不难,重点是在不同的位置安装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切换到用户root,运行
mkdir /var/www/fcgi-bin for i in {1..3}; do web_root=/var/www/web$i mkdir $web_root echo "" > $web_root/index.php done
注意:空/ var/www/fcgi-bin目录是必需的,请勿在以后删除
3)创建Apache配置文件(附加到httpd.conf)
NameVirtualHost *:80 # module settings # mod_fcgididletimeout 3600 processlifetime 7200 maxprocesscount 17 maxrequestsperprocess 16 ipcconnecttimeout 60 ipccommtimeout 90 # mod_fastcgi with php-fpmFastCgiExternalServer /var/www/fcgi-bin/php-fpm -host 127.0.0.1:9000 # virtual hosts... ################################################################# #1st virtual host, use mod_php, run php-5.1 #################################################################ServerName web1.example.com DocumentRoot "/var/www/web1" ################################################################# #2nd virtual host, use mod_fcgid, run php-5.2 #################################################################AddHandler php5-script .php DirectoryIndex index.php index.html index.htm Options -Indexes FollowSymLinks Order allow,deny Allow from all ServerName web2.example.com DocumentRoot "/var/www/web2" ################################################################# #3rd virtual host, use mod_fastcgi + php-fpm, run php-5.3 #################################################################AddHandler fcgid-script .php FCGIWrapper /usr/local/php52/bin/fcgiwrapper.sh DirectoryIndex index.php index.html index.htm Options -Indexes FollowSymLinks +ExecCGI Order allow,deny Allow from all ServerName web3.example.com DocumentRoot "/var/www/web3" ScriptAlias /fcgi-bin/ /var/www/fcgi-bin/ AddHandler php5-fastcgi .php Action php5-fastcgi /fcgi-bin/php-fpm DirectoryIndex index.php index.html index.htm Options -Indexes FollowSymLinks +ExecCGI Order allow,deny Allow from all
4)重启apache.尊重访问3个站点以查看phpinfo并验证结果.即:
http://web1.example.com http://web2.example.com http://web3.example.com
如果一切正常,您可以使用3虚拟主机之一作为模板来创建具有所需php版本的新虚拟主机.
一种方法是使用mod_php设置你的主要版本的php,并通过不同端口上的快速cgi运行所有其他的(即81,82,83等).但这并不能保证完全一致的行为.
有多个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目录中的加载和conf文件,以及其他版本的包含.您可以使用简单的bash脚本自动执行此操作(删除实际文件,复制备用版本文件,然后重新启动apache.
这种设置的一个优点是一切都很有用,所以只要你保持php.ini在选项和模块方面是相同的(无论如何你必须使用CGI).他们都在经历SAPI.您的应用程序不需要任何更改,也不需要使用相对URL.
我认为这应该有效,但是我再次尝试过,我也没有尝试过,因为我没有和你一样的要求.如果您尝试过,请发表评论.
注意:以下方法适用于Windows.
另一种方法(如果可以一次运行单个版本的PHP)是定义多个Apache服务,每个服务将使用不同的PHP版本.
首先使用Apache配置文件中的条件:
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" 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"
现在使用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"的"通知区域图标程序"来根据需要启动和停止服务.我已经为它添加了上述两项服务.