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执行速度全攻略
Oct 09 PHP
基于mysql的论坛(1)
Oct 09 PHP
怎么样可以把 phpinfo()屏蔽掉?
Nov 24 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
php教程 插件机制在PHP中实现方案
Nov 02 PHP
php实现监听事件
Nov 06 PHP
php使用百度翻译api示例分享
Jan 31 PHP
php使用curl抓取qq空间的访客信息示例
Feb 28 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
如何让thinkphp在模型中自动完成session赋值小教程
Sep 05 PHP
Yii使用Captcha验证码的方法
Dec 28 PHP
TP5框架简单登录功能实现方法示例
Oct 31 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
php处理抢购类功能的高并发请求
2018/02/08 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
基于JQuery的6个Tab选项卡插件
2010/09/03 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
微信js-sdk 录音功能的示例代码
2019/11/01 Javascript
python中requests使用代理proxies方法介绍
2017/10/25 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
Python3监控疫情的完整代码
2020/02/20 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
J2EE面试题
2016/03/14 面试题
2014新年寄语
2014/01/20 职场文书
作风建设年活动总结
2014/08/27 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
中秋节祝酒词
2015/08/12 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python