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日期时间函数的高级应用技巧
May 16 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
Sep 07 PHP
关于尾递归的使用详解
May 02 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
Jun 27 PHP
如何使用php判断服务器是否是HTTPS连接
Jul 05 PHP
laravel 4安装及入门图文教程
Oct 29 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
php结合正则获取字符串中数字
Jun 19 PHP
微信支付开发维权通知实例
Jul 12 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 PHP
php识别翻转iphone拍摄的颠倒图片
May 17 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 foreach 使用&amp;(与运算符)引用赋值要注意的问题
2010/02/16 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
PHP浮点数精度问题汇总
2015/05/13 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
python装饰器常见使用方法分析
2019/06/26 Python
python提取log文件内容并画出图表
2019/07/08 Python
详解python 中in 的 用法
2019/12/12 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
关于元旦的广播稿
2014/02/16 职场文书
对标管理实施方案
2014/03/12 职场文书
经典广告词大全
2014/03/14 职场文书
交通安全责任书范本
2014/07/24 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
文明单位创建材料
2014/12/24 职场文书
工程质检员岗位职责
2015/04/08 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python