php5共存php7

PHP7与PHP5共存于CentOS7

原文参考php

原理

思路很简单:PHP5是经过yum安装的在/usr/,套接字在/var/run/php-fpm.socket,PHP7本身编译装在/usr/local/php7,套接字在/var/run/php7-fpm.socket,nignx根据应用须要跑的环境指定fastcgi_pass。 或者两个不一样的端口,一个使用默认的9000,一个使用9002mysql

编译并安装PHP7

yum安装编译须要的各类依赖包nginx

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源码,解压git

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

而后设置编译参数,这里有几个事情要提一下:github

  1. 为了减小后续由于权限致使的问题,建议将nginx和php-fpm用相同的用户和用户组即(--with-fpm-user=nginx --with-fpm-group=nginx)
  2. 为了减小多网卡等复杂网络环境形成的问题,在不使用ipv6网络的状况下关闭ipv6的支持(--disable-ipv6)。 根据本身的状况选择
  3. 开启mysql数据库的API扩展(--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd )
  4. 开启opcache扩展(--enable-opcache)

完整的编译参数:redis

./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一下。sql

PS: make test很耗费时间,但其实跟make install差很少,在make test后,直接make install很快数据库

配置PHP7json

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

修改相应的配置文件(根据需求修改),下面是配置时区vim

date.timezone ="Asia/Shanghai"

a.centos7版本启动文件的修改

make install无错安装成功以后就开始进行配置,首先将默认配置复制到指定位置

cp -R ./sapi/fpm/php-fpm.service /usr/lib/systemd/system/php7-fpm.service
/usr/lib/systemd/system/php7-fpm.service

修改相应路径就行了。。。我也没有测试

b.centos6版本启动文件的修改

cp -R ./sapi/fpm/init.d.php-fpm /etc/init.d/php7-fpm  # 这样启动的时候名字不会冲突
    chmod +x /etc/init.d/php7-fpm

修改启动项名称vi /etc/init.d/php7-fpm

prefix=/usr/local/php7
    exec_prefix=${prefix}
    
    php_fpm_BIN=${exec_prefix}/sbin/php7-fpm
    php_fpm_CONF=${prefix}/etc/php7-fpm.conf
    php_fpm_PID=${prefix}/var/run/php7-fpm.pid

添加开机启动,创建软连

chkconfig --add php7-fpm
chkconfig php7-fpm  on  # 这两步根据须要选择
ln -s  /usr/local/php7/bin/php  /usr/bin/php

启动php7-fpm

centos7

systemctl enable php7-fpm.service
    systemctl start  php7-fpm.service

centos6

sudo /etc/init.d/php7-fpm restart
编译报错处理
# 找到相似的报错libiconv_open,由于内容找不到了

PHP7 编译安装时碰到 undefined reference to `libiconv_open' 问题解决方法  系统环境centos6.7

make install 的时候遇到错误:

ext/gd/libgd/.libs/gdkanji.o: In function `do_convert':
/root/src/php-7.1.3/ext/gd/libgd/gdkanji.c:349: undefined reference to `libiconv_open'
/root/src/php-7.1.3/ext/gd/libgd/gdkanji.c:364: undefined reference to `libiconv'
/root/src/php-7.1.3/ext/gd/libgd/gdkanji.c:380: undefined reference to `libiconv_close'
ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_dtor':
/root/src/php-7.1.3/ext/iconv/iconv.c:2565: undefined reference to `libiconv_close'
ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor':
/root/src/php-7.1.3/ext/iconv/iconv.c:2591: undefined reference to `libiconv_open'
ext/iconv/.libs/iconv.o: In function `_php_iconv_strlen':
/root/src/php-7.1.3/ext/iconv/iconv.c:754: undefined reference to `libiconv_open'
/root/src/php-7.1.3/ext/iconv/iconv.c:778: undefined reference to `libiconv'
/root/src/php-7.1.3/ext/iconv/iconv.c:812: undefined reference to `libiconv_close'

解决方法:

vim Makefile,添加"-liconv":
结果以下所示:

EXTRA_LIBS = -lcrypt -lresolv -lcrypt -lrt -lpng -lz -lcurl -lz -lrt -lm -ldl -lnsl -lxml2 -lz -lm -ldl -lcurl -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lcrypt -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lcrypt -liconv

再次 make install 经过

安装扩展模块

mysql模块

因为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”之类的错误提示。

不过咱们公司使用的是--with-pdo-mysql=mysqlnd 因此没有出现mysql链接问题,这里给遇到的同窗一个连接php7_mysql扩展模块安装

redis模块

1.git clone:

git clone  https://github.com/phpredis/phpredis.git

官网:https://github.com/phpredis/phpredis

切换分支:

git checkout -b php7 origin/php7

2.检查PHP扩展

/usr/local/php7/bin/phpize  # 根据我的路径来,若是是php5的扩展模块就不是这个结果了

3.创建编译链接、安装

./configure --with-php-config=/usr/local/php7/bin/php-config
make
make test
make install

4.检查so文件

cd /usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303  
# 这里的家目录不同,主要是仍是最后一级目录名称
ls

5.修改php.ini

vi /usr/local/php7/etc/php.ini
添加:extension="redis.so"

6.检查模块

php7 -m |grep redis
# php -m是检查扩展模块的

若是有redis则表示正常

7.重启php-fpm

sudo /etc/init.d/php7-fpm restart

nginx 配置

对应的php启动不一样的端口,或者socket模式,

# fastcgi_pass  unix:/var/run/php7-fpm.socket;
fastcgi_pass fastcgi_pass   127.0.0.1:9002;