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
- 爲了減小後續由於權限致使的問題,建議將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)
完整的編譯參數: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;