基于php-fpm 參數(shù)的深入理解_PHP教程
推薦:php-cli簡(jiǎn)介(不會(huì)Shell語(yǔ)言一樣用Shell)剛才說(shuō)到,我們可以用php來(lái)開(kāi)發(fā)Shell程序。有的同學(xué)可能會(huì)問(wèn)啦:php不是用來(lái)做網(wǎng)頁(yè)的么?。是的,php可以用來(lái)做動(dòng)態(tài)網(wǎng)頁(yè),并且當(dāng)初php就是為做動(dòng)態(tài)網(wǎng)頁(yè)而開(kāi)發(fā)的語(yǔ)言,但是理論上php可以用來(lái)做任何的程序,甚至是桌面程序
ps aux |grep php-fpm |more查看php-fpm總數(shù)
php-fpm.conf 配置
pid string
PID文件的位置. 默認(rèn)為空.
error_log string
錯(cuò)誤日志的位置. 默認(rèn): 安裝路徑#INSTALL_PREFIX#/log/php-fpm.log.
log_level string
錯(cuò)誤級(jí)別. 可用級(jí)別為: alert(必須立即處理), error(錯(cuò)誤情況), warning(警告情況), notice(一般重要信息), debug(調(diào)試信息). 默認(rèn): notice.
emergency_restart_threshold int
如果子進(jìn)程在emergency_restart_interval設(shè)定的時(shí)間內(nèi)收到該參數(shù)設(shè)定次數(shù)的SIGSEGV 或者 SIGBUS退出信息號(hào),則FPM會(huì)重新啟動(dòng)。 0 表示 ‘關(guān)閉該功能'. 默認(rèn)值: 0 (關(guān)閉).
emergency_restart_interval mixed
emergency_restart_interval用于設(shè)定平滑重啟的間隔時(shí)間. 這么做有助于解決加速器中共享內(nèi)存的使用問(wèn)題. 可用單位: s(秒), m(分), h(小時(shí)), 或者 d(天). 默認(rèn)單位: s(秒). 默認(rèn)值: 0 (關(guān)閉).
process_control_timeout mixed
設(shè)置子進(jìn)程接受主進(jìn)程復(fù)用信號(hào)的超時(shí)時(shí)間. 可用單位: s(秒), m(分), h(小時(shí)), 或者 d(天) 默認(rèn)單位: s(秒). 默認(rèn)值: 0.
daemonize boolean
設(shè)置FPM在后臺(tái)運(yùn)行. 設(shè)置 ‘no' 將 FPM 保持在前臺(tái)運(yùn)行用于調(diào)試. 默認(rèn)值: yes.
運(yùn)行配置區(qū)段
在FPM中,可以使用不同的設(shè)置來(lái)運(yùn)行多個(gè)進(jìn)程池。 這些設(shè)置可以針對(duì)每個(gè)進(jìn)程池單獨(dú)設(shè)置。
listen string
設(shè)置接受FastCGI請(qǐng)求的地址. 可用格式為: ‘ip:port', ‘port', ‘/path/to/unix/socket'. 每個(gè)進(jìn)程池都需要設(shè)置.
listen.backlog int
設(shè)置 listen(2) 的半連接隊(duì)列長(zhǎng)度. ‘-1′ 表示無(wú)限制. 默認(rèn)值: -1.
listen.allowed_clients string
設(shè)置允許連接到FastCGI的服務(wù)器IPV4地址. 等同于PHP FastCGI (5.2.2+)中的 FCGI_WEB_SERVER_ADDRS環(huán)境變量. 僅對(duì)TCP監(jiān)聽(tīng)起作用. 每個(gè)地址是用逗號(hào)分隔. 如果沒(méi)有設(shè)置或者為空,則允許任何服務(wù)器請(qǐng)求連接. 默認(rèn)值: any.
listen.owner string
如果使用,表示設(shè)置Unix套接字的權(quán)限. 在Linux中,讀寫(xiě)權(quán)限必須設(shè)置,以便用于WEB服務(wù)器連接. 在很多BSD派生的系統(tǒng)中可以忽略權(quán)限允許自由連接. 默認(rèn)值: 運(yùn)行所使用的用戶(hù)合租, 權(quán)限為0666.
listen.group string
參見(jiàn) listen.owner.
listen.mode string
參見(jiàn) listen.owner.
user string
FPM 進(jìn)程運(yùn)行的Unix用戶(hù). 必須設(shè)置.
group string
FPM 進(jìn)程運(yùn)行的Unix用戶(hù)組. 如果沒(méi)有設(shè)置,則默認(rèn)用戶(hù)的組被使用.
pm string
設(shè)置進(jìn)程管理器如何管理子進(jìn)程. 可用值: static, dynamic. 必須設(shè)置.
static – 子進(jìn)程的數(shù)量是固定的 (pm.max_children).
dynamic – 子進(jìn)程的數(shù)量在下面配置的基礎(chǔ)上動(dòng)態(tài)設(shè)置: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
pm.max_children int
子進(jìn)程的數(shù)量,pm 設(shè)置為 static 時(shí)表示創(chuàng)建的, pm 設(shè)置為 dynamic 時(shí)表示最大可創(chuàng)建的. 必須設(shè)置.
該選項(xiàng)設(shè)置可以同時(shí)提供服務(wù)的請(qǐng)求數(shù)限制. 類(lèi)似 Apache 的 mpm_prefork 中 MaxClients 的設(shè)置和 普通PHP FastCGI中的 PHP_FCGI_CHILDREN 環(huán)境變量.
pm.start_servers in
設(shè)置啟動(dòng)時(shí)創(chuàng)建的子進(jìn)程數(shù)目. 僅在 pm 設(shè)置為 dynamic 時(shí)使用. 默認(rèn)值: min_spare_servers + (max_spare_servers – min_spare_servers) / 2.
pm.min_spare_servers int
設(shè)置空閑服務(wù)進(jìn)程的最低數(shù)目. 僅在 pm 設(shè)置為 dynamic 時(shí)使用. 必須設(shè)置.
pm.max_spare_servers int
設(shè)置空閑服務(wù)進(jìn)程的最大數(shù)目. 僅在 pm 設(shè)置為 dynamic 時(shí)使用. 必須設(shè)置.
pm.max_requests int
設(shè)置每個(gè)子進(jìn)程重生之前服務(wù)的請(qǐng)求數(shù). 對(duì)于可能存在內(nèi)存泄漏的第三方模塊來(lái)說(shuō)是非常有用的. 如果設(shè)置為 '0′ 則一直接受請(qǐng)求. 等同于 PHP_FCGI_MAX_REQUESTS 環(huán)境變量. 默認(rèn)值: 0.
pm.status_path string
FPM狀態(tài)頁(yè)面的網(wǎng)址. 如果沒(méi)有設(shè)置, 則無(wú)法訪問(wèn)狀態(tài)頁(yè)面. 默認(rèn)值: none.
ping.path string
FPM監(jiān)控頁(yè)面的ping網(wǎng)址. 如果沒(méi)有設(shè)置, 則無(wú)法訪問(wèn)ping頁(yè)面. 該頁(yè)面用于外部檢測(cè)FPM是否存活并且可以響應(yīng)請(qǐng)求. 請(qǐng)注意必須以斜線(xiàn)開(kāi)頭 (/).
ping.response string
用于定義ping請(qǐng)求的返回相應(yīng). 返回為 HTTP 200 的 text/plain 格式文本. 默認(rèn)值: pong.
request_terminate_timeout mixed
設(shè)置單個(gè)請(qǐng)求的超時(shí)中止時(shí)間. 該選項(xiàng)可能會(huì)對(duì)php.ini設(shè)置中的'max_execution_time'因?yàn)槟承┨厥庠驔](méi)有中止運(yùn)行的腳本有用. 設(shè)置為 '0′ 表示 ‘Off'. Available units: s(econds)(default), m(inutes), h(ours), or d(ays). Default value: 0.
request_slowlog_timeout mixed
當(dāng)一個(gè)請(qǐng)求該設(shè)置的超時(shí)時(shí)間后,就會(huì)將對(duì)應(yīng)的PHP調(diào)用堆棧信息完整寫(xiě)入到慢日志中. 設(shè)置為 '0′ 表示 ‘Off'. 可用單位: s(秒)(默認(rèn)), m(分), h(小時(shí)), 或者 d(天). 默認(rèn)值: 0.
slowlog string
慢請(qǐng)求的記錄日志. 默認(rèn)值: #INSTALL_PREFIX#/log/php-fpm.log.slow.
request_slowlog_timeout
范圍: php-fpm.conf 選項(xiàng)
分類(lèi): 方便
這個(gè)選項(xiàng)能讓你跟蹤執(zhí)行緩慢的腳本并把他們連同調(diào)用棧一起記錄再日志文件中。例如如下設(shè)置:
<value name="request_slowlog_timeout">5s</value>
<value name="slowlog">logs/slow.log</value>
記錄的 slow.log 可能是這個(gè)樣子:
Sep 21 16:22:19.399162 pid 29715 (pool default)
script_filename = /local/www/stable/www/catalogue.php
[0x00007fff23618120] mysql_query() /srv/stable/common/Database/class.MySQLRequest.php:20
[0x00007fff23618560] getResult() /srv/stable/common/Database/class.Facade.php:106
[0x00007fff23618aa0] query() /srv/stable/common/mysite.com/ORM/class.UsersMapper.php:99
[0x00007fff23618d60] resolveByID() /srv/stable/common/mysite.com/ORM/class.User.php:629
[0x00007fff236193b0] getData() /srv/stable/common/class.DataEntity.php:90
[0x00007fff236195d0] load() /srv/stable/common/mysite.com/ORM/class.User.php:587
[0x00007fff23619a00] getIsHidden() /srv/stable/common/mysite.com/class.User.php:42
[0x00007fff2361a470] getName() /local/www/stable/www/catalogue.php:41
同時(shí),在 error.log 中保存了如下記錄:
Sep 21 16:22:19.399031 [WARNING] fpm_request_check_timed_out(), line 135: child 29715, script '/local/www/stable/www/catalogue.php' (pool default) executing too slow (5.018002 sec), logging
正如你再例子中看到的,腳本運(yùn)行了 5 秒以上,并很可能是由于 mysql 響應(yīng)慢造成的(top backtrace)。
rlimit_files int
設(shè)置文件打開(kāi)描述符的rlimit限制. 默認(rèn)值: 系統(tǒng)定義值.
rlimit_core int
設(shè)置核心rlimit最大限制值. 可用值: ‘unlimited' 、0或者正整數(shù). 默認(rèn)值: 系統(tǒng)定義值.
chroot string
啟動(dòng)時(shí)的Chroot目錄. 所定義的目錄需要是絕對(duì)路徑. 如果沒(méi)有設(shè)置, 則chroot不被使用.
chdir string
設(shè)置啟動(dòng)目錄,啟動(dòng)時(shí)會(huì)自動(dòng)Chdir到該目錄. 所定義的目錄需要是絕對(duì)路徑. 默認(rèn)值: 當(dāng)前目錄,或者/目錄(chroot時(shí)).
catch_workers_output boolean
重定向運(yùn)行過(guò)程中的stdout和stderr到主要的錯(cuò)誤日志文件中. 如果沒(méi)有設(shè)置, stdout 和 stderr 將會(huì)根據(jù)FastCGI的規(guī)則被重定向到 /dev/null . 默認(rèn)值: 空.
你還可以在為一個(gè)運(yùn)行池傳遞附加的環(huán)境變量,或者更新PHP的配置值. 你可以在 php-fpm.conf 中下如下面的配置參數(shù)來(lái)做到:
Example #1 給運(yùn)行池傳遞環(huán)境變量和設(shè)置PHP的配置值
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f [email protected]
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
PHP配置值通過(guò) php_value 或者 php_flag 設(shè)置,并且會(huì)覆蓋以前的值. 請(qǐng)注意 disable_functions 或者 disable_classes 在 php.ini 之中定義的值不會(huì)被覆蓋掉, 但是會(huì)將新的設(shè)置附加在原有值的后面.
使用 php_admin_value 或者 php_admin_flag 定義的值,不能被PHP代碼中的 ini_set() 覆蓋.
FAQ
Q:php-fpm 可以和 ZendOptimize 一起用嗎?
A:完全可以。
Q:php-fpm 可以和 ZendPlatform、xcache、eAccelerator、APC 等的優(yōu)化器一起用嗎?
A:是的。php-fpm 的架構(gòu)和任何一種用于高速 opcode 緩存的共享內(nèi)存都適用。唯一的限制是:所有的 worker 進(jìn)程只能適用一個(gè)緩存,即使它們用不同的 uid/gid 運(yùn)行
Q:為什么我要給 php 打補(bǔ)丁呢?spawn-fcgi 不需要這樣!
A:php-fpm 的創(chuàng)建是為了增強(qiáng)方便管理。沒(méi)有打過(guò)補(bǔ)丁的 php 不能做到:
平滑重啟 php 而不丟失請(qǐng)求,包括升級(jí) php 二進(jìn)制文件 以及/或者 擴(kuò)展。
用不同的 uid / gid / chroot 環(huán)境運(yùn)行 worker 進(jìn)程
所有的設(shè)置只有一個(gè)配置文件
根據(jù)負(fù)載動(dòng)態(tài)請(qǐng)求 (TODO)
對(duì) php 請(qǐng)求實(shí)時(shí)統(tǒng)計(jì)性能 (TODO)
Q:為什么要用 root 運(yùn)行 php-fpm 呢?這安全嗎?
A:用 root 啟動(dòng) php-fpm 只有在你打算用不同 uid/gid 的 php 來(lái)處理請(qǐng)求時(shí)才有意義。比如,在共享主機(jī)上的不同站點(diǎn)。因?yàn)橹挥性?master 進(jìn)程用 root 運(yùn)行的時(shí)候,才可以建立不同 uid/gid 的子進(jìn)程。這是相當(dāng)安全的。master 進(jìn)程自己從來(lái)不會(huì)去處理請(qǐng)求。
在任何情況下,php- fpm 都不會(huì)用 root 身份來(lái)處理請(qǐng)求。
Q:php-fpm 可以加速 php 腳本處理速度嗎?
A:不,它不會(huì)影響處理速度。不過(guò),如果你使用一些特殊特性,對(duì)于一些特定的請(qǐng)求還是可以有性能提升的。
Q:如果我把我的網(wǎng)站從 mod_php 遷移到 php-fpm ,我會(huì)得到性能提升嗎?
A:通常,當(dāng)有服務(wù)器上有大量空閑內(nèi)存可用時(shí),能從遷移到 php-fpm 中得到的性能提升可能不大。但是如果內(nèi)存并不充裕,性能提升還是很可觀的,在某些情況下可以達(dá)到 300-500%。這可能是由于 nginx + php-fpm 一般會(huì)比 Apache + mod_php 使用更少的內(nèi)存。而且 VFS 緩存會(huì)由于更多的空余內(nèi)存而更有效地工作。
Q:php- fpm 將來(lái)會(huì)被官方的 php 包含嗎?
A:我希望如此。目前,php-fpm 代碼的協(xié)議是 GPL 。所以現(xiàn)在 php-fpm 的代碼與 php 協(xié)議(類(lèi)似 bsd)并不匹配。這是臨時(shí)性措施。這樣的選擇是為了簡(jiǎn)化開(kāi)發(fā)過(guò)程。一旦代碼的功能完備,比如自適應(yīng)生成子進(jìn)程和其他一些東西,協(xié)議會(huì)改為一個(gè)相匹配的。之后,php-fpm 會(huì)正式發(fā)布給 php 開(kāi)發(fā)團(tuán)隊(duì),并被建議包含。
分享:基于在生產(chǎn)環(huán)境中使用php性能測(cè)試工具xhprof的詳解本篇文章是對(duì)在生產(chǎn)環(huán)境中使用php性能測(cè)試工具xhprof進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問(wèn)控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶(hù)端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- PHP教程:五個(gè)使用PHP制作動(dòng)態(tài)網(wǎng)頁(yè)的技巧
- 怎樣用PHP編程語(yǔ)言開(kāi)發(fā)動(dòng)態(tài)WAP頁(yè)面
- PHP MYSQL實(shí)例:網(wǎng)站在線(xiàn)人數(shù)的程序代碼
- php匹配字符中鏈接地址程序代碼
- php面向?qū)ο髉ublic private protected 訪問(wèn)修飾符
- 怎樣使用PHP服務(wù)端代理抓取網(wǎng)頁(yè)內(nèi)容
- PHP Shell的編寫(xiě)(改進(jìn)版)
- 詳解PHP分頁(yè)顯示制作
- php生成二維碼的幾種方式整理及使用實(shí)例
- 相關(guān)鏈接:
- 教程說(shuō)明:
PHP教程-基于php-fpm 參數(shù)的深入理解
。