CentOS 7.2編譯安裝PHP7

原文: https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referral
PHP官方:http://php.net/
Github源:https://github.com/php/php-src/releases
 
1 建立php用戶和用戶組,並在github下載php7源碼
#######新建php用戶和php組
[root@typecodes ~]# groupadd -r www && useradd -r -g www -s /bin/false -d /usr/local/php7 -M php

#####安裝編譯php7時須要的依賴包
[root@typecodes ~]# yum -y install libxml2 libxml2-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

###libzip(若是再編譯PHP時提示須要升級libzip)###
https://github.com/nih-at/libzip/releases
cd /usr/local/src && wget https://nih.at/libzip/libzip-1.2.0.tar.gz && tar -zxvf libzip-1.2.0.tar.gz && cd libzip-1.2.0 && ./configure && make && make install
cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipconf.h
2 PHP7編譯參數的配置

準備工做作好後,就開始正式配置php7的安裝明細了。注意,操做時必定要先把下面反斜槓「\」後面添加的註釋文字去掉!!!php

cd /usr/local/src && wget http://cn2.php.net/get/php-7.3.10.tar.bz2/from/this/mirror -O php-7.3.10.tar.bz2 && tar -xjvf php-7.3.10.tar.bz2 && cd php-7.3.10
######開始配置 [root@typecodes php-7.3.10]# ./configure \ --prefix=/usr/local/php7 \ --exec-prefix=/usr/local/php7 \ --bindir=/usr/local/php7/bin \ --sbindir=/usr/local/php7/sbin \ --includedir=/usr/local/php7/include \ --libdir=/usr/local/php7/lib/php \ --mandir=/usr/local/php7/php/man \ --with-config-file-path=/usr/local/php7/etc \ --with-mysql-sock=/var/lib/mysql/mysql.sock \ --with-mcrypt=/usr/include \ --with-mhash \ --with-openssl=/usr/local/openssl \ --with-mysql=shared,mysqlnd \ --with-mysqli=shared,mysqlnd \ --with-pdo-mysql=shared,mysqlnd \ --with-gd \ --with-iconv \ --with-zlib \ --enable-zip \ --enable-inline-optimization \ --disable-debug \ --disable-rpath \ --enable-shared \ --enable-xml \ --enable-bcmath \ --enable-shmop \ --enable-sysvsem \ --enable-mbregex \ --enable-mbstring \ --enable-ftp \ --enable-gd-native-ttf \ --enable-pcntl \ --enable-sockets \ --with-xmlrpc \ --enable-soap \ --without-pear \ --with-gettext \ --enable-session \ --with-curl \ --with-jpeg-dir \ --with-freetype-dir \ --enable-opcache \ --enable-fpm \ --enable-fastcgi \ --with-fpm-user=www \ --with-fpm-group=www \ --without-gdbm \ --disable-fileinfo

執行上面的配置命令的結果:html

configure: WARNING: unrecognized options: --with-mysql, --enable-fastcgimysql

若報錯:configure: error: off_t undefined; check your library configuration,需執行如下命令:nginx

echo '/usr/local/lib64
/usr/local/lib
/usr/lib
/usr/lib64
/usr/local/mysql/lib' >> /etc/ld.so.conf && ldconfig -vgit

 

3 開始編譯和安裝PHP7
[root@typecodes php-7.3.10]# make distclean && make && make install

部分編譯出錯的環境請使用github

#make ZEND_EXTRA_LIBS='-liconv';
#make installweb

編譯安裝完成PHP7!redis

 

5 查看編譯成功後的PHP7安裝目錄

因爲須要和MySQL進行通訊,因此須要特別查看PHP7安裝後的lib擴展庫目錄(/usr/local/php7/lib/php/extensions/no-debug-non-zts-20180731/),須要確保至少存在mysqli.sopdo_mysql.so這兩個動態庫文件。sql

 

6 開始設置PHP7的配置文件php.ini、php-fpm.conf、www.conf和php-fpm腳本

能夠用編譯後的配置文件複製到PHP7的配置目錄(/usr/local/php7/etc/),推薦使用《PHP7中php.ini、php-fpm和www.conf的配置》文中整理的3個PHP7配置文件和php-fpm服務控制腳本。bootstrap

find /usr -name *php.ini*

#######直接使用編譯後未經優化處理的配置
cp /usr/local/src/php-7.3.10/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 /usr/local/src/php-7.3.10/sapi/fpm/php-fpm.service /lib/systemd/system/php-fpm.service

#######安裝redis(https://github.com/phpredis/phpredis/releases#用phpize生成configure配置文件
cd /usr/local/src && wget https://github.com/phpredis/phpredis/archive/5.0.0.tar.gz -O phpredis-5.0.0.tar.gz && tar zxvf phpredis-5.0.0.tar.gz && cd phpredis-5.0.0
/usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install
 
 
#######選擇安裝swoole(https://github.com/swoole/swoole-src/releases)
cd /usr/local/src && wget https://github.com/swoole/swoole-src/archive/v4.4.8.tar.gz -O swoole-4.4.8.tar.gz && tar zxvf swoole-4.4.8.tar.gz && cd swoole-src-4.4.8
/usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install

 
 
#######安裝mcrypt(http://pecl.php.net/package/mcrypt)7.2移除mcrypt致使兼容性問題
cd /usr/local/src && wget http://pecl.php.net/get/mcrypt-1.0.2.tgz && tar zxvf mcrypt-1.0.2.tgz && cd mcrypt-1.0.2
/usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install



#######去掉文件中的註釋、空行
vi /usr/local/php7/etc/php.ini
vi /usr/local/php7/etc/php-fpm.conf
vi /usr/local/php7/etc/php-fpm.d/www.conf

:g/^;/d
:g/^$/d

1. 配置php-fpm.conf

php-fpm.conf是php-fpm進程服務的配置文件:

######Pid file的默認前綴是/usr/local/php7/var
pid = run/php-fpm.pid
error_log = /var/log/php-fpm/error.log
include=/usr/local/php7/etc/php-fpm.d/*.conf
2. 配置www.conf(在php-fpm.d目錄下)

www.conf這是php-fpm進程服務的擴展配置文件:

######設置用戶和用戶組
user = www
group = www

######根據nginx.conf中的配置fastcgi_pass unix:/dev/shm/php-fpm.sock;設置PHP監聽
; listen = 127.0.0.1:9000   #####不建議使用
listen = /dev/shm/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0777
listen.allowed_clients = /dev/shm/php-fpm.sock

######使用靜態進程數max_children=內存/512
pm = static
pm.max_children = 200
pm.max_requests = 0

pm.status_path = /FpmStatus

######開啓慢日誌
slowlog = /var/log/php-fpm/$pool-slow.log
request_slowlog_timeout = 30s
request_slowlog_trace_depth = 20
request_terminate_timeout = 0
3. 配置php.ini

php.ini是php運行核心配置文件:

######避免PHP信息暴露在http頭中
expose_php = Off

######經常使用配置
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
display_errors = Off
log_errors = On
html_errors = Off
error_log = /var/log/php/php-error.log
ignore_repeated_errors = On
ignore_repeated_source = On

memory_limit = 512M
max_execution_time = 600
max_input_time = -1
post_max_size = 128M
max_input_vars = 1000000
file_uploads = On
upload_tmp_dir = /tmp/www
upload_max_filesize = 100M
session.gc_maxlifetime = 14400
default_socket_timeout = 600
######設置PHP的擴展
extension_dir = "/usr/local/php7/lib/php/extensions/no-debug-non-zts-20180731"
zend_extension=opcache.so
extension=mcrypt.so
extension=mysqli.so
extension=pdo_mysql.so
extension=redis.so
extension=swoole.so ######設置PHP的時區 date.timezone = "Asia/Shanghai" ######開啓opcache [opcache] opcache.enable=1
opcache.enable_cli=1
opcache.huge_code_pages=1
opcache.file_cache=/tmp
######設置PHP腳本容許訪問的目錄(須要根據實際狀況配置)
;open_basedir = /usr/share/nginx/html;

session.save_handler = redis
session.save_path = "tcp://*****.aliyuncs.com:6379?auth=******"

[MySQLi]
mysqli.reconnect = On
4 在配置文件中使用到的路徑或文件,配置權限
mkdir -p /var/log/php/
mkdir -p /var/log/php-fpm/
mkdir -p /run/php-fpm/
mkdir -p /var/lib/php/session

touch /dev/shm/php-fpm.sock
chown www.www /dev/shm/php-fpm.sock
chmod 777 /dev/shm/php-fpm.sock
chown -R www:www /var/lib/php

######配置PHP鏈接MySQL的端口監聽文件
mkdir -p /var/lib/mysql/
touch /var/lib/mysql/mysql.sock
touch /usr/local/php7/var/run/php-fpm.pid
chmod 777 /var/lib/mysql/mysql.sock
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

5 測試php-fpm配置,設置開機自啓動
######測試配置
/usr/local/php7/sbin/php-fpm -t

######修改文件權限
chmod 745 /lib/systemd/system/php-fpm.service

######設置爲開機啓動
systemctl enable php-fpm.service

######啓動php-fpm
systemctl start php-fpm.service

 經過命令ps -aux|grep php查看是否成功(圖中的php-fpm進程數和進程用戶www都是由www.conf中pm.start_servers和user的值分別決定的):

 

11 查看PHP7版本信息

最後,能夠經過命令php -v查看當前PHP版本信息,圖中能夠看到當前PHP7還使用了Zend OPcache緩存,是由於在php.ini文件中添加了zend_extension=opcache.so配置。

systemctl restart php-fpm
systemctl restart nginx

kill -USR2 `cat /usr/local/php7/var/run/php-fpm.pid`
/usr/local/nginx/sbin/nginx -s reload

==============================================================
分配512個預留的大頁內存,優化PHP-opcache:
sysctl vm.nr_hugepages=512

 

vi /etc/profile  底部加入

export PATH=$PATH:/usr/local/php7/bin

 

特別優化:

一、修改/usr/local/nginx/conf/nginx.conf 文件
worker_processes  設置爲cpu個數或cpu的核數
查看CPU核數:cat /proc/cpuinfo | grep "cpu cores" | uniq

worker_connections  設置爲進程打開文件句柄數量
ulimit -n進行查看, 默認1024,建議修改成65535 【修改/etc/security/limits.conf,最後增長一行記錄 * - nofile 65535】

http中
client_max_body_size 100m;
client_body_buffer_size 2048k;

 

=====================================================================================================

對於進程的管理存在兩種風格——static和dynamic。

若是設置成static,php-fpm進程數自始至終都是pm.max_children指定的數量,再也不增長或減小。

若是設置成dynamic,則php-fpm進程數是動態的,最開始是pm.start_servers指定的數量,若是請求較多,則會自動增長,保證空閒的進程數不小於pm.min_spare_servers,若是進程數較多,也會進行相應清理,保證多餘的進程數很少於pm.max_spare_servers。

這兩種不一樣的進程管理方式,能夠根據服務器的實際需求來進行調整。

這裏先說一下涉及到這個的幾個參數,他們分別是pmpm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers

pm表示使用那種方式,有兩個值能夠選擇,就是static(靜態)或者dynamic(動態)。

下面4個參數的意思分別爲:

pm.max_children:static模式下建立的子進程數或dynamic模式下同一時刻容許最大的php-fpm子進程數量。 
pm.max_requests:php-fpm子進程能處理的最大請求數。 
pm.start_servers:動態方式下的起始php-fpm進程數量。 
pm.min_spare_servers:動態方式下服務器空閒時最小php-fpm進程數量。 
pm.max_spare_servers:動態方式下服務器空閒時最大php-fpm進程數量。

若是dm設置爲static,那麼其實只有pm.max_children這個參數生效。系統會開啓設置數量的php-fpm進程(專用服務器推薦使用)。

若是dm設置爲dynamic,那麼pm.max_children參數失效,後面3個參數生效。系統會在php-fpm運行開始的時候啓動pm.start_servers個php-fpm進程,而後根據系統的需求動態在pm.min_spare_servers和pm.max_spare_servers之間調整php-fpm進程數。

那麼,對於咱們的服務器,選擇哪一種執行方式比較好呢?事實上,跟Apache同樣,運行的PHP程序在執行完成後,或多或少會有內存泄露的問題。這也是爲何開始的時候一個php-fpm進程只佔用3M左右內存,運行一段時間後就會上升到20-30M的緣由了。

對於內存大的服務器(好比8G以上)來講,指定靜態的max_children實際上更爲穩當,由於這樣不須要進行額外的進程數目控制,會提升效率。由於頻繁開關php-fpm進程也會有時滯,因此內存夠大的狀況下開靜態效果會更好。數量也能夠根據 內存/30M 獲得,好比8GB內存能夠設置爲100,那麼php-fpm耗費的內存就能控制在 2G-3G的樣子。若是內存稍微小點,好比1G,那麼指定靜態的進程數量更加有利於服務器的穩定。這樣能夠保證php-fpm只獲取夠用的內存,將很少的內存分配給其餘應用去使用,會使系統的運行更加暢通。

那麼對於通常的服務器,怎麼設置這些值呢,也是有值可參考的。
通常一個php-cgi進程佔用20~30m左右的內存,php-fpm稍多一點,就按30m算吧。你的物理mem大小/30m差很少就是能夠設置的php-fpm進程數了,固然實際確定要比這個少點。好比我8G的內存,大概設置100~200之間,也就是pm.max_children=100 是一個比較合適的值。

這裏面還有一個問題,php-fpm由於一些第三方庫可能會引發內存泄漏,時間長了,佔用的內存會比較多,像咱們的服務器如今就是50m左右,還好,有pm.max_requests這個參數,這個參數指定了一個php-fpm子進程執行多少次以後重啓該進程。這個可能就要根據你的實際狀況調整了

php-fpm有一個參數 max_requests,該參數指明瞭,每一個children最多處理多少個請求後便會被關閉,默認的設置是500。由於php是把請求輪詢給每一個children,在大流量下,每一個childre到達max_requests所用的時間都差很少,這樣就形成全部的children基本上在同一時間被關閉,這樣會致使此時nginx發給php的請求沒法獲得相應,會出現短期的502.解決方法:

增長children的數量,而且將 max_requests 設置未 0 或者一個比較大的值

單php-fpm佔用內存 = 內存佔用總量 / php-fpm進程數

查看內存使用量: free -m

 

static :表示在 `php-fpm` 運行時直接 `fork` 出 `pm.max_chindren` 個子進程,
dynamic:表示,運行時 `fork` 出 `start_servers` 個進程,隨着負載的狀況,動態的調整,最多不超過 `max_children` 個進程。

通常推薦用 static。
    優勢是不用動態的判斷負載狀況,提高性能;
    缺點是多佔用些系統內存資源。

 PHP-FPM 子進程數量,是否是越多越好?
 固然不是,pm.max_chindren,進程多了,增長進程管理的開銷以及上下文切換的開銷。
 更核心的是,能併發執行的 php-fpm 進程不會超過 cpu 個數。
 如何設置,取決於你的代碼
    若是代碼是 CPU 計算密集型的,pm.max_chindren 不能超過 CPU 的內核數。
    若是不是,那麼將 pm.max_chindren 的值大於 CPU 的內核數,是很是明智的。

 國外技術大拿給出這麼個公式:
 在 N + 20% 和 M / m 之間。
    N 是 CPU 內核數量。
    M 是 PHP 能利用的內存數量。
    m 是每一個 PHP 進程平均使用的內存數量。

 適用於 dynamic 方式。
 static方式:M / (m * 1.2)

 固然,還有一種保險的方式,來配置 max_children。適用於 static 方式。
    先把 max_childnren 設置成一個比較大的值。
    穩定運行一段時間後,觀察 php-fpm 的 status 裏的 max active processes 是多少
    而後把 max_children 配置比它大一些就能夠了。

 pm.max_requests:指的是每一個子進程在處理了多少個請求數量以後就重啓。
 這個參數,理論上能夠隨便設置,可是爲了預防內存泄漏的風險,仍是設置一個合理的數比較好。

 

=====================================================================================================

php-fpm管理,master進程能夠理解如下信號:
INT,TERM 馬上終止
QUIT 平滑終止
USR1 從新打開日誌文件
USR2 平滑重載全部worker進程並從新載入配置和二進制模塊

示例:
php-fpm 關閉:
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

php-fpm 重啓:
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

查看php-fpm進程數:
ps aux | grep -c php-fpm

 

php-fpm status詳解

pool – fpm池子名稱,大多數爲www
process manager – 進程管理方式,值:static, dynamic or ondemand. dynamic
start time – 啓動日期,若是reload了php-fpm,時間會更新
start since – 運行時長
accepted conn – 當前池子接受的請求數
listen queue – 請求等待隊列,若是這個值不爲0,那麼要增長FPM的進程數量
max listen queue – 請求等待隊列最高的數量
listen queue len – socket等待隊列長度
idle processes – 空閒進程數量
active processes – 活躍進程數量
total processes – 總進程數量
max active processes – 最大的活躍進程數量(FPM啓動開始算)
max children reached - 大道進程最大數量限制的次數,若是這個數量不爲0,那說明你的最大進程數量過小了,請改大一點。
slow requests – 啓用了php-fpm slow-log,緩慢請求的數量

 

 

===========升級CMake===========================

CMAKE官網:https://cmake.org/download/

cd /usr/local/src && wget https://github.com/Kitware/CMake/releases/download/v3.15.0/cmake-3.15.0.tar.gz && tar zxvf cmake-3.15.0.tar.gz && cd  cmake-3.15.0
./bootstrap && gmake && gmake install  或者 ./configure --prefix=/usr && make && make install


mv /usr/local/src/cmake-3.14.5-Linux-x86_64 /usr/local/cmake
vi /etc/profile.d/cmake.sh

export CMAKE_HOME=/usr/local/cmake
export PATH=$PATH:$CMAKE_HOME/bin

source /etc/profile
cmake -version

 

===========升級libzip===========================

cd /usr/local/src
wget https://libzip.org/download/libzip-1.5.2.tar.xz
tar -zxvf libzip-1.5.2.tar.xz && mv libzip-1.5.2 /usr/local/libzip && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/libzip && make && make install

 

==========安裝fileinfo擴展=====================

cd /usr/local/src/php-7.3.10/ext/fileinfo && /usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install

相關文章
相關標籤/搜索