Linux系统中设置多版本PHP共存配合Nginx服务器使用


Posted in PHP onDecember 21, 2015

应用环境

LNMP的环境,当前PHP版本5.3.8,遇到一个应用需求只支持PHP 5.2.x,又希望保持现有应用还是用PHP 5.3.8。也就是说需要两个版本的PHP同时存在,供nginx根据需要调用不同版本。

思路

Nginx是通过PHP-FastCGI与PHP交互的。而PHP-FastCGI运行后会通过文件、或本地端口两种方式进行监听,在Nginx中配置相应的FastCGI监听端口或文件即实现Nginx请求对PHP的解释。

既然PHP-FastCGI是监听端口和文件的,那就可以让不同版本的PHP-FastCGI同时运行,监听不同的端口或文件,Nginx中根据需求配置调用不同的PHP-FastCGI端口或文件,即可实现不同版本PHP共存了。

配置记录

下面记录简单的配置流程,基于已经安装了lnmp的debian环境。当前版本的PHP是5.3.8,位于/usr/local/php。

1.下载PHP-5.2.14及相关的FPM、autoconf组件:

mkdir ~/php5.2
cd ~/php5.2
wget -c http://museum.php.net/php5/php-5.2.14.tar.gz
wget -c http://php-fpm.org/downloads/php-5.2.14-fpm-0.5.14.diff.gz

2.解压PHP-5.2.14,并打上PHP-FPM的补丁:

tar zxvf php-5.2.14.tar.gz
gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1

3.如果你已经通过lnmp安装,应该已经安装好了autoconf,如果没有,请自行下载并编译autoconf-2.13,然后设置autoconf环境变量:

export PHP_AUTOCONF=/usr/local/autoconf-2.13/bin/autoconf¬
export PHP_AUTOHEADER=/usr/local/autoconf-2.13/bin/autoheader

3.编译安装PHP-5.2.14在新的路径(/usr/local/php-5.2.14)下,注意?prefix、?with-config-file-path的路径,并且打开fastcgi和fpm选项:

cd php-5.2.14/
./buildconf --force
./configure --prefix=/usr/local/php-5.2.14 --with-config-file-path=/usr/local/php-5.2.14/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-fastcgi --enable-fpm
make ZEND_EXTRA_LIBS='-liconv'
make install

4.设置/usr/local/php-5.2.14/etc/php-fpm.conf,监听端口:

<value name="listen_address">127.0.0.1:9001</value>

或者监听文件:

<value name="listen_address">/path/to/unix/socket</value>

其他参数根据服务器环境和需求自行定制。
5.启动php-fpm,以后可以通过php-fpm进行管理:

/usr/local/php-5.2.14/sbin/php-fpm start

字php5.3.3后,php已经将php-fpm继承到php中,而且内置的php-fpm默认不支持(start|stop|reload)的平滑启动参数,需要使用官方源代码中提供的启动脚本来控制:

cp -f (php -5.3.x-source-dir)/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod 755 /etc/init.d/php-fpm
/etc/init.d/php-fpm start

php-fpm支持的操作:

  • start,启动PHP的FastCGI进程。
  • stop,强制终止PHP的FastCGI进程。
  • quit,平滑终止PHP的FastCGI进程。
  • restart, 重启PHP的FastCGI进程。
  • reload, 重新加载PHP的php.ini。
  • logrotate, 重新启用log文件。

5.3.3的php-fpm脚本支持的操作:start|stop|force-quit|restart|reload|status

6.配置好PHP-5.2.14的php.ini,重新加载生效:

vi /usr/local/php-5.2.14/etc/php.ini
/usr/local/php-5.2.14/sbin/php-fpm reload
7.修改nginx配置,对需要的服务配置使用PHP-5.2.14:

location ~ .*.(php|php5)?$
    {
      fastcgi_pass 127.0.0.1:9001;
      fastcgi_index index.php;
      include fcgi.conf;
    }
8.记录一下自己编译php5.5.10使用的配置
./configure --prefix=/usr/local/php-5.5.10 --with-config-file-path=/usr/local/php-5.5.10/etc --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-bz2 --with-curl=/usr/bin --enable-ftp --enable-sockets --disable-ipv6 --with-gd --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-freetype-dir=/usr/local --enable-gd-native-ttf --with-iconv-dir=/usr/local --enable-mbstring --enable-calendar --with-gettext --with-libxml-dir=/usr/local --with-zlib --with-pdo-mysql=mysqlnd --enable-dom --enable-xml --enable-fpm --with-libdir=lib64 --with-mcrypt=/usr/bin --enable-zip --enable-soap --enable-mbstring --with-gd --with-openssl --enable-pcntl --with-xmlrpc --enable-opcache
							
PHP 相关文章推荐
用PHP进行MySQL删除记录操作代码
Jun 07 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
Feb 16 PHP
PHP安全技术之 实现php基本安全
Sep 04 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
Dec 19 PHP
php 搜索框提示(自动完成)实例代码
Feb 05 PHP
PHP编码规范的深入探讨
Jun 06 PHP
PHP中file_exists函数不支持中文名的解决方法
Jul 26 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
PHP isset()与empty()的使用区别详解
Feb 10 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
Dec 21 #PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 #PHP
反射调用private方法实践(php、java)
Dec 21 #PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 #PHP
变量在 PHP7 内部的实现(二)
Dec 21 #PHP
变量在 PHP7 内部的实现(一)
Dec 21 #PHP
php阿拉伯数字转中文人民币大写
Dec 21 #PHP
You might like
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
PHP开发的一些注意点总结
2010/10/12 PHP
重新认识php array_merge函数
2014/08/31 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
jquery中:input和input的区别分析
2011/07/13 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
Python-基础-入门 简介
2014/08/09 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
Python中@property的理解和使用示例
2019/06/11 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
python MD5加密的示例
2020/10/19 Python
阿姆斯特丹杜莎夫人蜡像馆官方网站:Madame Tussauds Amsterdam
2019/03/12 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
金属材料工程个人求职的自我评价
2013/12/04 职场文书
教职工代表大会主持词
2014/04/01 职场文书
一年级小学生评语
2014/04/22 职场文书