PHP7与PHP5共存于CentOS7
服务器上除了小部分只能在PHP5下跑的老应用外,其他的都能在PHP7下跑。所以在复习建造师考试的空余就折腾了一下PHP双版本的共存。思路很简单:PHP5是通过yum安装的在/usr/,套接字在/var/run/php-fpm.socket,PHP7自己编译装在/usr/local/php7,套接字在/var/run/php7-fpm.socket,nignx根据应用需要跑的环境指定fastcgi_pass。
编译并安装PHP7
先通过yum来安装编译需要的各种依赖包
yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel -y
接着到官网下载最新的PHP源码(现在是7.1.8),解压
cd ~
wget http://am1.php.net/distributions/php-7.1.8.tar.gz
tar xvf php-7.1.8.tar.gz
cd php-7.1.8
然后设置编译参数,这里有几个事情要提一下:
- 为了减少后续因为权限导致的问题,建议将nginx和php-fpm用相同的用户和用户组即(--with-fpm-user=nginx --with-fpm-group=nginx)。
- 为了减少多网卡等复杂网络环境造成的问题,在不使用ipv6网络的情况下关闭ipv6的支持(--disable-ipv6)。
- 开启mysql数据库的API扩展(--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd )
- 开启opcache扩展(--enable-opcache)
完整的编译参数如下:
./configure \
--prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7/etc \
--with-config-file-scan-dir=/usr/local/php7/etc/php.d/ \
--disable-ipv6 \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-soap \
--with-libxml-dir \
--with-xmlrpc \
--with-openssl \
--with-mcrypt \
--with-mhash \
--with-pcre-regex \
--with-sqlite3 \
--with-zlib \
--enable-bcmath \
--with-iconv \
--with-bz2 \
--enable-calendar \
--with-curl \
--with-cdb \
--enable-dom \
--enable-exif \
--enable-fileinfo \
--enable-filter \
--with-pcre-dir \
--enable-ftp \
--with-gd \
--with-openssl-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-freetype-dir \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--with-gettext \
--with-gmp \
--with-mhash \
--enable-json \
--enable-mbstring \
--enable-mbregex \
--enable-mbregex-backtrack \
--with-libmbfl \
--with-onig \
--enable-pdo \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-zlib-dir \
--with-pdo-sqlite \
--with-readline \
--enable-session \
--enable-shmop \
--enable-simplexml \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--with-libxml-dir \
--with-xsl \
--enable-zip \
--enable-mysqlnd-compression-support \
--with-pear \
--enable-opcache
设置检查通过之后就是喜闻乐见的make和make install了,有兴趣的可以在make install之前make test一下。
配置PHP7
make install无错安装成功之后就开始进行配置,首先将默认配置复制到指定位置,
cp php.ini-production /usr/local/php7/etc/php.ini
cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
cp -R ./sapi/fpm/php-fpm.service /usr/lib/systemd/system/php7-fpm.service
然后按照需求进行修改,必须修改的内容有:
- /usr/local/php7/etc/php-fpm.d/www.conf中:
listen = /var/run/php7-fpm.socket
listen的位置就是nignx中fastcgi_pass的unix套接字地址。
- /usr/local/php7/etc/php.ini中:
pdo_mysql.default_socket=/var/lib/mysql/mysql.sock
由于PHP从5.x开始,PHP连接MYSQL无论使用哪种方式都是使用的mysqlnd驱动,且PHP7已经正式移除了mysql扩展,由于新特性的原因,PHP7针对数据库主机地址为localhost和127.0.0.1时分别会采用unix domain socket和TCP/IP两种不同的方式连接MySQL服务。
而采用unix domain socket方式时PHP7会使用默认的/tmp/mysql.sock作为套接字,但是CentOS7默认MySQL服务MariaDB的套接字位置为/var/lib/mysql/mysql.sock,于是即使是所有数据库连接信息都正确的情况下也会出现诸如“mysqli::real_connect(): (HY000/2002): No such file or directory ” 和 “Error establishing a database connection”之类的错误提示。
为了避免这个莫名其妙的问题,请将pdo_mysql.default_socket修改为MySQL服务的socket地址。
cgi.fix_pathinfo=0
默认cgi.fix_pathinfo=1,这是一个曾经产生了大面积安全风险的默认设置项,虽然现在PHP-FPM已经做了安全过滤,但是出于安全考虑还是在php.ini中也关闭吧。pathinfo功能在nginx里可以通过正则来实现。
date.timezone ="Asia/Hong_Kong"
修改时区,避免时间混乱的情况。
disable_functions = exec,passthru,popen,proc_open,shell_exec,system,assert,chroot,delete,rmdir,rename,chgrp,chmod,chown,copy,mkdir
关闭部分可能带来危险的函数,如果没有特殊需求的话建议加上。
zend_extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/opcache.so
[opcache]
opcache.force_restart_timeout=3600
opcache.memory_consumption=128
opcache.optimization_level=1
opcache.max_accelerated_files=4096
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable=1
opcache.enable_cli=1
Zend OPcache通过opcode缓存和优化避免重复编译,减少CPU和内存开销提供更快的PHP执行速度,作为PHP7的高性能扩展之一,不开可惜哦~ 这部分内容可以单独形成ini文件放在/usr/local/php7/etc/php.d/目录下,也可以直接添加在php.ini中,启用之后最好在phpinfo中确认Zend OPcache状态正常。
其他日志权限之类的常规配置就不再赘述,配置完了就添加自启并启动PHP-FPM服务
systemctl enable php7-fpm.service
systemctl start php7-fpm.service
配置Nginx
这个不多说,对能够在PHP7上跑的vhost,将其fastcgi_pass改到PHP7的套接字上就好了
fastcgi_pass unix:/var/run/php7-fpm.socket;
对了,在nginx中实现pathinfo之后,记得在fastcgi_params中加上
try_files $uri = 404;
用来阻止不必要的数据传到后端php7-fpm,先这样吧,下次再来填坑。
「倘若有所帮助,不妨酌情赞赏!」
感谢您的支持!
使用微信扫描二维码完成支付
很棒,感谢楼主!
非常有帮助哦,感谢holmsian。。
非常有帮助哦,感谢holmsian。。
赶紧去加上了 try_files = =
不错,学习了~