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;
相關文章
相關標籤/搜索