通過效能評測,可以看出PHP7對效能進行了較大的優化,相比與PHP5.x
有50%-150%
的效能提升,因此,為了提升我們服務的響應速度,降低機器負載,需要進行版本升級。
因為對二進位制比較熟悉,所以沒有用yum
的方式進行安裝,採用的二進位制安裝方式比較靈活,但是因為第一次安裝PHP
的高版本,也引入了很多的問題,總而言之,就是在錯誤中不斷摸索錯誤,最終找到一個還能用的道路。
下載PHP7.2
wget http://cn2.php.net/get/php-7.2.13.tar.bz2/from/this/mirror -O php-7.2.13.tar.bz2
tar -xjvf php-7.2.13.tar.bz2
// 用於後面編譯的生成程式碼目錄
mkdir php7
cd php-7.2.13
配置PHP
PHP
編譯前提供了大量的引數進行配置,包括支援的擴充套件、執行使用者等,可以檢視引數列表。
我們進行最簡單的配置,只支援php-fpm
管理,因為我們的PHP
是配合Ngnix
來進行服務,因此還要指定執行的使用者:
./configure --prefix=/home/work/lnmp/php7 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx
我的第一次編譯報錯:
configure: error: OpenSSL version 1.0.1 or greater required.
解決這個問題,需要首先看自己的openssl
的版本資訊:
$ openssl version
OpenSSL 1.0.0-fips 29 Mar 2010
因此更新openssl
版本:
wget https://www.openssl.org/source/openssl-1.1.0j.tar.gz
tar -xzvf openssl-1.1.0j.tar.gz
cd openssl-1.1.0j
./config --prefix=/usr/local/ssl shared zlib-dynamic
make
make install
mv /usr/bin/openssl /usr/bin/openssl1.0.0
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
安裝完畢再次配置依然報相同錯誤,因此我們需要手動指定openssl
的位置:
// 檢視指定openssl的引數
$./configure --help | grep openssl
--with-openssl=DIR Include OpenSSL support (requires OpenSSL >= 1.0.1)
--with-openssl-dir=DIR FTP: openssl install prefix
--with-openssl-dir=DIR SNMP: openssl install prefix
$ ./configure --prefix=/home/work/lnmp/php7 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-openssl=/usr/bin/openssl
安裝
make && make install
啟動
因為我是升級,所以原有Nginx
和程式碼以及配置檔案都是OK
的狀態,可能在這個階段你會遇到不同的問題,這個得結合你的情況進行解決。
cd php7
// 複製php.ini和php-fpm.conf到etc/目錄下,這個過程你也可以自己配置啊
// 生成兩個目錄用於日誌和sock檔案儲存
mkdir log
mkdir run
sbin/php-fpm -c etc/php.ini -y etc/php-fpm.conf -p .
啟動成功,訪問URL
,報錯:502 Bad Gateway
502 Bad Gateway
根據nginx
的訪問日誌可以看出:
$ cat error.log
2018/12/14 10:54:18 [crit] 6260#0: *206 open() "./run/factcgi_temp/0000000015" failed (13: Permission denied) while reading upstream, client: 172.24.162.178, se
rver: , request: "GET /oss/index.php HTTP/1.1", upstream: "fastcgi://unix:run/phpfpm.sock:", host: "xx.xx.
com"
查閱【資料1】【資料2】可以知道,在PHP
老版本里,有一個bug
,任何能夠連線socket
檔案的使用者可以通過它執行任何命令,特別是在Ubuntu
系統裡允許www-data
使用者執行任何程式碼。因此最新版本里修復了這個錯誤,但也導致我們出現了502
的問題,因此我們需要配套升級我們的配置檔案:
// 在nginx.conf頭部新增執行使用者
user www www;
// 在php-fpm.conf裡放棄註釋這3行
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
; mode is set to 0666
listen.owner = www
listen.group = www
listen.mode = 0660
重啟nginx
和php-fpm
程式,依然報錯:
nginx: [emerg] getpwnam("www") failed
因為我們沒有加上這個使用者:
useradd -r www
搞定,重啟nginx
和php-fpm
程式,服務正常。
總結
使用二進位制來安裝PHP7.2
,在編譯的時候按需載入擴充套件,如果有問題,我們可以重新編譯,也可以動態擴充套件。過程比較簡單,但我的服務並沒有正常服務,因為使用的Yii2.0
不能夠完美相容PHP7
,我還得對Yii2.0
進行升級,以及對自身的程式碼進行升級。
參考資料
- PHP7.2下載地址:http://php.net/downloads.php
- PHP的效能演進:http://www.laruence.com/2016/…
- OpenSSl downloads:https://www.openssl.org/source/
- OpenSSL 安裝、介紹:https://www.jianshu.com/p/291…
- Centos7 安裝 PHP7最新版:https://www.jianshu.com/p/246…
- CentOS 7 Linux 安裝PHP7.2 – 編譯安裝:https://blog.csdn.net/ai_zxc/…
- nginx error connect to php5-fpm.sock failed (13: Permission denied):https://stackoverflow.com/que…
- nginx安裝 nginx: [emerg] getpwnam(“www”) failed 錯誤:https://blog.csdn.net/justdoi…