年前,终于迎来了期待已久的 php7 正式版,我也在第一时间就给博客用上了。性能确实有了质的飞跃,问题还是有不少的。比如鱼叔的微信插件在 php7 下面自动回复异常等。
为了继续使用微信插件,我只好将 php5.6 又开了起来,下面简单分享一下多个版本 php 共存的方法。
一、编译路径
多个版本 php 要共存,必须使用不同的安装路径。比如,之前 php5.6 安装在/usr/local/php,那么我们安装 php7 的时候,就应该定义到 /usr/local/php7 等不一样的路径。
就如之前 php7 编译安装分享的那样,把安装目录和配置文件目录都指向新的路径:
1 2 3 4 5 6 7 8 9 | CFLAGS= CXXFLAGS= ./configure —prefix=/usr/local/php7 —with–config–file–path=/usr/local/php7/etc —with–fpm–user=www —with–fpm–group=www —enable–fpm —enable–opcache —disable–fileinfo —with–mysqli=mysqlnd —with–pdo–mysql=mysqlnd —with–jpeg–dir —with–iconv–dir=/usr/local —with–freetype–dir —with–png–dir —with–zlib —disable–rpath —with–libxml–dir=/usr —enable–xml —enable–bcmath —enable–shmop —enable–exif —with–curl —enable–sysvsem —enable–inline–optimization —enable–mbregex —enable–inline–optimization —enable–mbstring —with–mcrypt —with–gd —enable–gd–native–ttf —with–openssl —with–mhash —enable–pcntl —enable–sockets —with–xmlrpc —enable–ftp —with–gettext —enable–zip —enable–soap —disable–ipv6 —disable–debug |
具体安装这里就不多说了,请自行翻看之前的文章==>传送门
二、配置修改
编译安装完 php7 之后,我们需要将配置文件中涉及的路径都更新为 php7 的实际路径,具体如下:
①、php-fpm.conf
1 2 3 4 5 6 7 8 | #编辑 vim /usr/local/php7/etc/php–fpm.conf #找到如下参数: listen = /dev/shm/php–cgi.sock #改为 listen = /dev/shm/php7–cgi.sock #保存退出 :wq |
如此一来,php5.6 和 php7 的 sock 监听文件分别为/dev/shm/php-cgi.sock 和/dev/shm/php7-cgi.sock。
②、nginx 配置
nginx 配置只需要修改 php 动态解析的 sock 指向即可:
在站点对应的 nginx 配置文件中(比如,vhost/zhangge.net.conf )找到:
1 2 3 4 5 6 | location ~ [^/].php(/|$) { try_files $uri =404; fastcgi_pass unix:/dev/shm/php–cgi.sock; fastcgi_index index.php; include fastcgi.conf; } |
将其中的
1 2 3 | fastcgi_pass unix:/dev/shm/php–cgi.sock; 改为: fastcgi_pass unix:/dev/shm/php7–cgi.sock; #路径改为和该版本php的sock监听路径一致 |
然后重启 nginx 就能将此站点环境更新到 php7 了。
说白了,就是你想让站点用哪个版本就修改为该版本的监听文件路径。当然,也有一些 php 用的是端口的监听模式,修改原理一致!
如果只是某些特殊的页面需要使用 php 的其他版本,也只要新增额外的 location。假如,网站有一个目录是另外的建站程序,不支持 php7,那么我们需要额外设置下即可:
1 2 3 4 5 6 | location /wap { try_files $uri =404; fastcgi_pass unix:/dev/shm/php–cgi.sock; #对于/wap这个路径,使用php5.6 fastcgi_index index.php; include fastcgi.conf; } |
更多需求,举一反三即可!
三、启动脚本
在第二步,我们修改了 php 的配置,但是也没启动 php。怎么启动很简单,我们先修改下服务脚本:
找到 PHP5.6 的服务脚本 /etc/init.d/php-fpm
1 2 3 4 5 6 7 8 9 10 | #复制一份: cp /etc/init.d/php–fpm /etc/init.d/php7 #编辑修改: vim /etc/init.d/php7 #找到 prefix=/usr/local/php #改为 prefix=/usr/local/php7 #最后保存退出 :wq |
现在,我们就可以使用 service php7 start 启动 php7 了,而之前的 php5.6 则继续使用 service php-fpm start 启动。
四、其他考虑
上述修改,只是让多个版本的 php 能够同时 run 起来,并未考虑多个版本的资源抢占问题。其实,还是有些许文章可以做的。
比如,php-fpm.conf 会对 php 的进程数量、响应超时等进行优化配置,很多时候我们都是用的单个 php 环境的最优配置。不过,当我们跑了多个 php 版本的时候,这些配置就应该折中考虑一下了。
就拿我博客举例,我让 php5.6 继续存在只是为了微信的一个插件,也就只是博客的小部分功能,其他绝大多数功能还是要用 php7 的,所以我在配置这个 php-fpm 的时候,会将 php7 的线程等资源给多一些,php5.6 我就只给了一个主进程和一个子线程了。
好了,以上内容就是 php 多版本共存分享,充分理解下 nginx 和 php 的交互,本文分享可有可无。