php-fpm優(yōu)化總結(jié)經(jīng)驗分享
Nginx 與 php-fpm 運行流程
- Nginx 查看 nginx.conf 配置文件
- 加載 nginx 的 fast-cgi 模塊
- php-fpm 監(jiān)聽 127.0.0.1:9000
- php-fpm 接收到請求,啟用 worker 進程處理請求
- php-fpm 處理完請求,返回給 nginx
- nginx 將結(jié)果通過 http 返回給瀏覽器\

Nginx 與 php-fpm 通信機制
www.test.com
|
|
Nginx
|
|
路由到 www.test.com/index.php
|
|
加載 nginx 的 fast-cgi 模塊
|
|
fast-cgi 監(jiān)聽 127.0.0.1:9000 地址
|
|
www.test.com/index.php 請求到達 127.0.0.1:9000
|
|
等待處理...
Nginx 與 php-fpm 的結(jié)合
- 在 Linux 上,nginx 與 php-fpm 的通信有 tcp socket 和 unix socket 兩種方式。
- tcp socket 的優(yōu)點是可以跨服務(wù)器,當 nginx 和 php-fpm 不在同一臺機器上時,只能使用這種方式。
- Unix socket 又叫 IPC (inter-process communication 進程間通信) socket,用于實現(xiàn)同一主機上的進程間通信,這種方式需要在 nginx 配置文件中填寫 php-fpm 的 socket 文件位置。
兩種方式的數(shù)據(jù)傳輸過程如下圖所示:

php-fpm 進程管理
php-fpm 采用的是 master-worker 的進程方式。其中,
- master 負責監(jiān)聽端口,等待鏈接;其次,注冊信號,可以通過信息好 master 進行管理
- worker 負責處理具體的邏輯
查看 php-fpm 日志信息 - 默認路徑 -/usr/local/php/var/log
php-fpm 優(yōu)化
php.ini 優(yōu)化
//默認情況下服務(wù)器對上傳文件的大小是有限制的,如果想修改上傳文件的限制可以修改php.ini文件 file_uploads = On; //是否允許上傳文件 upload_max_filesize = 1024M; //上傳文件的最大限制 post_max_size = 1024M; //通過post提交的最多數(shù)據(jù) max_execution_time = 300; //腳本最長的執(zhí)行時間 單位為秒 max_input_time = 30000; //接收提交的數(shù)據(jù)的時間限制 單位為秒 memory_limit = 256M; //每個腳本使用的最大內(nèi)存 ;在安全模式下,你不能用ini_set()在運行時改變這個設(shè)置。
php-fpm.conf 優(yōu)化
(1)進程數(shù)設(shè)置
pm = dynamic pm.max_children = 15 //靜態(tài)方式下開啟的php-fpm進程數(shù)量 pm.start_servers = 5 //動態(tài)方式下的起始php-fpm進程數(shù)量 pm.min_spare_servers = 5 //動態(tài)方式下 空閑時間最小的php-fpm進程 pm.max_spare_servers = 5 //動態(tài)方式下 空閑時間最大的php-fpm進程
(2)最大處理請求數(shù)
最大處理請求數(shù)是指一個php-fpm的worker進程在處理多少個請求后就終止掉,master進程會重新respawn新的。
該配置可以避免php解釋器自身或程序引起的memory leaks。
默認值是500, pm.max_requests = 1024 這樣的規(guī)劃,1秒鐘
最大請求數(shù):15*1024=15360 最小請求數(shù):5*1024=7120
如何避免程序 hang 死
方法 1:設(shè)置 php-fpm 執(zhí)行的超時時間為固定值
vi php-fpm.conf 修改為request_terminate_timeout = 60
方法 2:定時 reload php-fpm
在負載較高的服務(wù)器上定時重載 php-fpm
reload 可以平滑重啟而不影響生產(chǎn)系統(tǒng)的 php 腳本運行,每 15 分鐘 reload 一次
0-59/15 * * * * /usr/local/php/sbin/php-fpm reload
方法 3:優(yōu)化進程池配置
php-fpm 根據(jù)配置文件內(nèi)容和實際情況,動態(tài)創(chuàng)建子進程來處理請求。
當達到能夠創(chuàng)建的最大值時,只能阻塞。一個個地進行執(zhí)行。
進程數(shù)優(yōu)化
pm = dynamic pm.max_children = 300 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35
最大請求數(shù)優(yōu)化
pm.max_requests = 10240
提示:這個用來處理因為 PHP 解析器或引用的第三方庫時,造成的內(nèi)存泄露問題。
最大請求數(shù):指一個 php-fpm 的工作進程在處理多少個請求后就終止掉。
最長執(zhí)行時間優(yōu)化(php.ini)
request_terminate_timeout = 20
提示:這個是用來處理因為 PHP 執(zhí)行時間超長而報 502 錯誤的解決。
這個時長配置可以在 php.ini(max_execution_time)或 php-fpm.conf 中配置均可,為了不影響全局配置,可在 php-fpm.conf 中實現(xiàn) crontab 定時任務(wù)把 php-fpm 平滑重啟,這種方式就是使用 crontab 定時任務(wù)去定時查詢網(wǎng)站是否 502 了,如果 502 了,就把 php-fpm 平滑重啟
首先在 /root/ 目錄下面創(chuàng)建腳本
vim restart-php-fpm.sh
然后給這個腳本賦予執(zhí)行權(quán)限
chmod +x /root/restart-php-fpm.sh
然后就是編寫腳本內(nèi)容了,上代碼
#!/bin/bash MY_URL="http://www.****.com/" RESULT=`curl -I $MY_URL|grep "HTTP/1.1 502"` if [ -n "$RESULT" ]; then /etc/init.d/php7.2-fpm restart fi
注意:
我是使用的 /etc/init.d/php7.2-fpm restart 這種方式重啟的
然后編寫定時任務(wù)
crontab -e /root/restart-php-fpm.sh
用 crontab -l 查看定時任務(wù)列表
以上就是php-fpm優(yōu)化總結(jié)經(jīng)驗分享的詳細內(nèi)容,更多關(guān)于php-fpm優(yōu)化經(jīng)驗的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解析php中array_merge與array+array的區(qū)別
本篇文章是對php中array_merge與array+array的區(qū)別進行了詳細的分析介紹,需要的朋友參考下2013-06-06
PHP 之 寫時復(fù)制介紹(Copy On Write)
很多時候,我們會因為一些術(shù)語而對其概念產(chǎn)生莫測高深的恐懼,而其實,他們的基本原理往往非常簡單。本小節(jié)將介紹PHP中寫時復(fù)制這種策略的實現(xiàn)2014-05-05
php判斷終端是手機還是電腦訪問網(wǎng)站的思路及代碼
解下來將寫個小程序使用php判斷終端是手機還是電腦訪問網(wǎng)站,感興趣的朋友可以參考下哈,希望對你學習php有所幫助2013-04-04
php?ZipArchive解壓縮實現(xiàn)后臺管理升級問題詳解
php?ZipArchive可以說是php自帶的一個函數(shù)了,他可對對文件進行壓縮與解壓縮處理,但是使用此類之前我們必須在php.ini中把extension=php_zip.dll前面的分號有沒有去掉,然后再重啟Apache這樣才能使用這個類庫2022-12-12

