国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

php-fpm詳解(轉(zhuǎn)過來給對fpm接觸不深的朋友加深基礎)

zh7314

2022年9月27日15:45:04

FastCGI(Fast Common Gateway Interface)快速通用網(wǎng)關接口,是 CGI 的增強版本,為了提升 CGI 的性能而生。
PHP-FPM(FastCGI Process Manager for PHP)PHP 的 FastCGI 進程管理器。FastCGI 只是一個協(xié)議規(guī)范,需要某個程序去具體實現(xiàn),而 PHP-FPM 就是這個具體實現(xiàn)。

ps -ef|grep php

root       2178      1  0 13:28 ?        00:00:00 php-fpm: master process (/usr/local/php80/etc/php-fpm.conf)
www        2179   2178  0 13:28 ?        00:00:00 php-fpm: pool www
www        2180   2178  0 13:28 ?        00:00:00 php-fpm: pool www
root       2248      1  0 13:29 ?        00:00:00 php-fpm: master process (/usr/local/php74/etc/php-fpm.conf)
www        2250   2248  0 13:29 ?        00:00:00 php-fpm: pool www
www        2251   2248  0 13:29 ?        00:00:00 php-fpm: pool www

這里可以看到fpm是一個常駐內(nèi)存的master -> worker的多進程工作模式

fpm是一個php的工作方式,請注意!

PHP的SAPI模塊 方式目前有以下幾種:
  1. CGI(通用網(wǎng)關接口/ Common Gateway Interface)
  2. FastCGI(常駐型CGI / Long-Live CGI)
  3. CLI(命令行運行 / Command Line Interface)
  4. Web模塊模式(Apache等Web服務器運行的模式)
  5. ISAPI(Internet Server Application Program Interface)
  6. LSAPI

強調(diào)一下,工作模式和php語言本身實現(xiàn)任何功能基本毫無影響,以上都是通過通信協(xié)議互相通信而已

https://www.php.net/manual/zh/function.php-sapi-name.php
返回接口類型的小寫字符串, 或者在失敗時返回 false。

對應的fpm代碼的如下:

D:\SRC_CODE\20220824\PHP-SRC_1\SAPI
├─apache2handler
├─cgi
│  └─tests
├─cli
│  └─tests
├─embed
├─fpm
│  ├─fpm
│  │  └─events
│  └─tests
├─fuzzer
│  ├─corpus
│  │  ├─exif
│  │  ├─json
│  │  └─unserialize
│  └─dict
├─litespeed
└─phpdbg
    └─tests
        └─bug73615

fpm自身是什么呢?

PS D:\src_code\20220824\php-src_1\sapi\fpm\fpm\events> ls
    目錄: D:\src_code\20220824\php-src_1\sapi\fpm\fpm\events

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2022/9/28     14:04           5872 devpoll.c
-a----         2022/9/28     14:04           1228 devpoll.h
-a----         2022/9/28     14:04           5192 epoll.c
-a----         2022/9/28     14:04           1220 epoll.h
-a----         2022/9/28     14:04           4876 kqueue.c
-a----         2022/9/28     14:04           1224 kqueue.h
-a----         2022/9/28     14:04           6465 poll.c
-a----         2022/9/28     14:04           1216 poll.h
-a----         2022/9/28     14:04           4931 port.c
-a----         2022/9/28     14:04           1216 port.h
-a----         2022/9/28     14:04           4187 select.c
-a----         2022/9/28     14:04           1224 select.h

PS D:\src_code\20220824\php-src_1\sapi\fpm\fpm> ls
    目錄: D:\src_code\20220824\php-src_1\sapi\fpm\fpm

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2022/9/28     14:04                events
-a----         2022/9/28     14:04           2966 fpm.c
-a----         2022/9/28     14:04           1160 fpm.h
-a----         2022/9/28     14:04           1951 fpm_arrays.h
-a----         2022/9/28     14:04           4127 fpm_atomic.h
-a----         2022/9/28     14:04          12090 fpm_children.c
-a----         2022/9/28     14:04            901 fpm_children.h
........省略

fpm是c實現(xiàn)了epoll kqueue poll select的event,的master worker的進程管理器,照理來說不會慢,才對

為什么大多數(shù)會認為fpm會慢,吃內(nèi)存呢?

參考:http://m.wtbis.cn/doc/webman/others/performance.html

  1. php-fpm請求開始初始化一切,請求結(jié)束銷毀一切的開銷
  2. php-fpm每次請求從磁盤讀取多個php文件,反復詞法語法解析、反復編譯成opcode開銷
  3. 框架反復創(chuàng)建框架相關類實例及初始化的開銷
  4. 框架反復連接斷開數(shù)據(jù)庫、redis等開銷
  5. nginx/apache自身開銷以及與php-fpm通訊開銷
  6. fpm是常駐類型,為什么維持worker的運行數(shù)量,不會歸還內(nèi)存給系統(tǒng)

其實主要是因為composer的出現(xiàn),導致框架的vendor越來越龐大,一個簡單laravel web項目vendor

[root@ vendor]# ls -lR| grep "^-" | wc -l
7066
[root@ vendor]# du -sh
57M

每次啟動就需要加載57M大小的7K+的文件,消耗很多磁盤IO和創(chuàng)建框架實例,消耗巨大
就導致laravel這么“重”的框架,訪問速度就很慢

有什么解決辦法呢?
開啟opcache
ops性能提升至少5-10倍左右,可以看下你的php.ini是否開啟(api請求,混編的頁面性能提升更?。?br /> php -m
是否包含Zend OPcache

設置pm.max_requests=0,就是不歸還,你可以把這個設置成pm.max_requests=50,就請求了50個之后,就釋放內(nèi)存給系統(tǒng)
如果max_requests太小,就會不停的請求內(nèi)存,釋放內(nèi)存性能有影響
設置成0,就會不釋放內(nèi)存,造成系統(tǒng)工作內(nèi)存資源太小,導致系統(tǒng)越來越卡

如何設置合理的配置呢?
1,pm = dynamic,這樣由fpm自己調(diào)整
2,需要更高性能的ops,根據(jù)自己大小簡單計算一下,比如4核8G內(nèi)存,8G至少留1g給系統(tǒng),php單個變量大小是128M,以此為最大基準,(7*1024)/128 = 56,這里是純fpm的機器,不包含nginx redis等服務,如果在同一個服務器就扣除其他運行內(nèi)存

pm = static
pm.max_children = 56
pm.start_servers = 20
pm.max_requests = 200

這里全部是理論數(shù)值

cat /proc/1197/status
cat /proc/$(pid)/status

查看

VmPeak:   247844 kB
VmSize:   234784 kB ——進程占用的虛擬內(nèi)存大小
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     34296 kB
VmRSS:     21660 kB ——占用的物理內(nèi)存 約21M

通常一個fpm的工作內(nèi)存是幾十M,上訴的設置是很寬松的,但是設置過多的children數(shù)量會受cpu的影響,頻繁切換cpu上下文的去執(zhí)行會造成一些性能影響,可以通過觀察服務器的訪問量,服務器內(nèi)存和cpu的使用量去了解最適合你業(yè)務系統(tǒng)的配置,需要一個過程。

比如你的業(yè)務系統(tǒng)查詢多,或者計算多,或者業(yè)務系統(tǒng)不同會對fpm設置都會需要微調(diào)

那么避免上述的所有的問題,開發(fā)一個常駐內(nèi)存,不需要頻繁加載文件,一個master worker的和其他組件通信可以是常駐內(nèi)存連接
的框架,那么php的性能是不是可以有非常大的提升,答案是:完全可以

一個完全由php開發(fā)的常駐內(nèi)存的mvc框架 基于workerman的webman就是一個很強大的php高性能框架,完美的避開了fpm的缺點

FastCGI的通信協(xié)議:

nginx和fpm通信協(xié)議是FastCGI,fpm有兩種對接模式,端口和sock

location ~ \.php(.*)$ {
            fastcgi_pass   unix:/usr/local/php80/php-fpm.sock;
            #fastcgi_pass   127.0.0.1:9001;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }

如果可以使用sock性能當然是更好的,但是nginx和fpm是分離的監(jiān)聽端口模式會更好一點,因為安全也是一個很大的因素

workerman也實現(xiàn)了FastCGI協(xié)議

php實現(xiàn)fastcgi
https://github.com/lisachenko/protocol-fcgi
nginx對接fastcgi
https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
FastCGI協(xié)議標準
https://www.infoq.cn/article/vicwtitzvk7b4ynoej3e

https://www.mit.edu/~yandros/doc/specs/fcgi-spec.html
https://www.myway5.com/index.php/2018/07/19/fastcgi-%E8%A7%84%E8%8C%83%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91/
https://www.imooc.com/article/details/id/45163
源碼
https://github.com/php/php-src/blob/master/main/fastcgi.c

如果你想對fastcgi有更多的了解
https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html
你就會發(fā)現(xiàn),nginx想的配置文件 fastcgi.conf fastcgi_params里面參數(shù)的意思

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

剩下就是最重要的配置文件,下面是基于php8.0的中文翻譯版
php-fpm.conf

;;;;;;;;;;;;;;;;;;;;;
; FPM 配置 ;
;;;;;;;;;;;;;;;;;;;;;

; 此配置文件中的所有相對路徑都是相對于 PHP 的安裝
; 前綴 (/usr/local/php80)。 這個前綴可以通過使用
; 命令行中的“-p”參數(shù)。

;;;;;;;;;;;;;;;;;;
; 全局 選項 ;
;;;;;;;;;;;;;;;;;;

[global]
; pid文件
; 注意:默認前綴是 /usr/local/php80/var
; 默認值:無
;pid = 運行/php-fpm.pid

pid = /usr/local/php80/php-fpm.pid

; 錯誤日志文件
; 如果它設置為“syslog”,日志將被發(fā)送到 syslogd 而不是被寫入
; 到本地文件中。
; 注意:默認前綴是 /usr/local/php80/var
; 默認值:log/php-fpm.log
;error_log = log/php-fpm.log

error_log = /data/log/php80/php-fpm.log

; syslog_facility 用于指定什么類型的程序正在記錄
; 信息。 這讓 syslogd 指定來自不同設施的消息
; 會以不同方式處理。
; 請參閱 syslog(3) 以獲取可能的值(例如 daemon equiv LOG_DAEMON)
; 默認值:daemon
;syslog.facility = daemon

; syslog_ident 附加在每條消息之前。 如果您有多個 FPM
; 在同一臺服務器上運行的實例,您可以更改默認值
; 這必須滿足共同的需求。
; 默認值:php-fpm
;syslog.ident = php-fpm

; 日志級別
; 可能的值:alert, error, warning, notice, debug
; 默認值: notice
;log_level = notice

; 單行中字符數(shù)的日志限制(日志條目)。 如果
; 行超過限制,它被包裹在多行上。 限制是為了
; 所有記錄的字符,包括消息前綴和后綴(如果存在)。 然而
; 換行符不計入其中,因為它僅在
; 記錄到文件描述符。 這意味著新行字符不存在
; 登錄到系統(tǒng)日志時。
; 默認值: 1024
;log_limit = 4096

; 日志緩沖指定日志行是否被緩沖,這意味著
; 行在單個寫入操作中寫入。 如果該值為 false,則
; 數(shù)據(jù)直接寫入文件描述符。 這是一個實驗
; 可以潛在地提高日志記錄性能和內(nèi)存使用的選項
; 對于一些繁重的日志記錄場景。 如果記錄到 syslog,則忽略此選項
; 因為它必須始終被緩沖。
; 默認值: yes
;log_buffering = no

; 如果此數(shù)量的子進程在此時間內(nèi)以 SIGSEGV 或 SIGBUS 退出
; 由 Emergency_restart_interval 設置的時間間隔,然后 FPM 將重新啟動。 一個值
; “0”表示“關閉”。
; 默認值: 0
;emergency_restart_threshold = 0

; Emergency_restart_interval 使用的時間間隔來確定何時
; 將啟動正常重啟。 這對于解決問題很有用
; 加速器共享內(nèi)存中的意外損壞。
; 可用單位:s(秒)、m(整數(shù))、h(我們的)或 d(ays)
; 默認單位:秒
; 默認值: 0
;emergency_restart_interval = 0

; 子進程等待主進程對信號做出反應的時間限制。
; 可用單位:s(秒)、m(整數(shù))、h(我們的)或 d(ays)
; 默認單位:秒
; 默認值:0
;process_control_timeout = 0

; FPM 將分叉的最大進程數(shù)。 這是為了控制
; 在許多池中使用動態(tài) PM 時的全局進程數(shù)。
; 謹慎使用。
; 注意:值為 0 表示沒有限制
; 默認值:0
; process.max = 128

; 指定 nice(2) 優(yōu)先級以應用于主進程(僅當設置時)
; 該值可以從 -19(最高優(yōu)先級)到 20(最低優(yōu)先級)變化
; 注意: - 僅當 FPM 主進程以 root 身份啟動時才有效
; - 池進程將繼承主進程優(yōu)先級
; 除非另有說明
; 默認值: no set
; process.priority = -19

; 將 FPM 發(fā)送到后臺。 設置為“否”以將 FPM 保持在前臺進行調(diào)試。
; 默認值: yes
;daemonize = yes

; 為主進程設置打開文件描述符 rlimit。
; 默認值: system defined value
;rlimit_files = 1024

; 為主進程設置最大核心大小 rlimit。
; 可能的值:“無限”或大于或等于 0 的整數(shù)
; 默認值: system defined value
;rlimit_core = 0

; 指定 FPM 將使用的事件機制。 以下是可用的:
; - select     (any POSIX os)
; - poll       (any POSIX os)
; - epoll      (linux >= 2.5.44)
; - kqueue     (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
; - /dev/poll  (Solaris >= 7)
; - port       (Solaris >= 10)
; Default Value: not set (auto detection)
;events.mechanism = epoll

; 當 FPM 使用 systemd 集成構(gòu)建時,指定間隔,
; 在幾秒鐘內(nèi),在向 systemd 的健康報告通知之間。
; 設置為 0 以禁用。
; 可用單位:s(秒)、m(整數(shù))、h(我們的)
; 默認單位:秒
; 默認值: 10
;systemd_interval = 10

;;;;;;;;;;;;;;;;;;;;
; 線程池定義        ;
;;;;;;;;;;;;;;;;;;;;

; 可以使用不同的偵聽方式啟動多個子進程池
; 端口和不同的管理選項。 池的名稱將是
; 用于日志和統(tǒng)計信息。 池的數(shù)量沒有限制
; FPM可以處理。 無論如何,您的系統(tǒng)會告訴您:)

; 包括一個或多個文件。 如果 glob(3) 存在,它用于包含一堆
; 來自 glob(3) 模式的文件。 該指令可以在任何地方使用
; 文件。
; 也可以使用相對路徑。 它們的前綴為:
; - 全局前綴(如果已設置)(-p 參數(shù))
;  - /usr/local/php80 otherwise
include=/usr/local/php80/etc/php-fpm.d/*.conf

www.conf

; 啟動一個名為“www”的新池。
; 變量 $pool 可以在任何指令中使用,并將被替換為
; 池名稱(此處為“www”)
[www]

; 每個池前綴
; 它僅適用于以下指令:
; - 'access.log'
; - 'slowlog'
; - 'listen' (unixsocket)
; - 'chroot'
; - 'chdir'
; - 'php_values'
; - 'php_admin_values'
; 如果未設置,則應用全局前綴(或 /usr/local/php80)。
; 注意:該指令也可以相對于全局前綴。
; 默認值: none
;prefix = /path/to/pools/$pool

; Unix 用戶/進程組
; 注意:用戶是強制性的。 如果未設置組,則默認用戶的組
; 將會被使用。
user = www
group = www

; 接受 FastCGI 請求的地址。
; 有效的語法是:
; 'ip.add.re.ss:port' - 在 TCP 套接字上偵聽特定 IPv4 地址
; 特定端口;
; '[ip:6:addr:ess]:port' - 在 TCP 套接字上監(jiān)聽特定 IPv6 地址
; 特定端口;
; 'port' - 在 TCP 套接字上偵聽所有地址
; (IPv6 和 IPv4 映射)在特定端口上;
; '/path/to/unix/socket' - 監(jiān)聽 unix 套接字。
; 注意:此值是強制性的。
;listen = 127.0.0.1:9000

listen = /usr/local/php80/php-fpm.sock

; 設置listen(2) 積壓的任務。
; 默認值:511(FreeBSD 和 OpenBSD 上為 -1)
;listen.backlog = 511

; 設置 unix 套接字的權限,如果使用的話。 在 Linux 中,讀/寫
; 必須設置權限才能允許來自 Web 服務器的連接。 許多
; BSD 派生系統(tǒng)允許連接而不管權限。 主人
; 和組可以通過名稱或它們的數(shù)字 ID 來指定。
; 默認值:用戶和組設置為運行用戶
; 模式設置為 0660

listen.owner = www
listen.group = www
listen.mode = 0660

; 當支持 POSIX 訪問控制列表時,您可以使用
; 在這些選項中,value 是用戶/組名稱的逗號分隔列表。
; 設置后,listen.owner 和 listen.group 將被忽略
;listen.acl_users =
;listen.acl_groups =

; 允許連接的 FastCGI 客戶端的地址列表(IPv4/IPv6)。
; 相當于原來的FCGI_WEB_SERVER_ADDRS環(huán)境變量
; PHP FCGI (5.2.2+)。 僅對 tcp 偵聽套接字才有意義。 每個地址
; 必須用逗號分隔。 如果此值留空,則連接將是
; 從任何 IP 地址接受。
; 默認值: any
;listen.allowed_clients = 127.0.0.1

; 指定 nice(2) 優(yōu)先級以應用于池進程(僅當設置時)
; 該值可以從 -19(最高優(yōu)先級)到 20(較低優(yōu)先級)變化
; 注意: - 僅當 FPM 主進程以 root 身份啟動時才有效
; - 池進程將繼承主進程優(yōu)先級
; 除非另有說明
; 默認值: no set
; process.priority = -19

; 設置進程可轉(zhuǎn)儲標志 (PR_SET_DUMPABLE prctl) 即使進程用戶
; 或組不同于主進程用戶。 它允許創(chuàng)建進程
; 池用戶的核心轉(zhuǎn)儲和 ptrace 進程。
; 默認值: no
; process.dumpable = yes

;選擇進程管理器將如何控制子進程的數(shù)量。
;可能的值:
;   static  - 固定數(shù)量(pm.max_children)的子進程;
;   dynamic - 子進程的數(shù)量是根據(jù)以下指令動態(tài)設置的。 使用此流程管理,將始終至少有 
;             1 個子進程。
;             pm.max_children      - 可以同時存活的子進程的最大數(shù)量
;             pm.start_servers     - 啟動子進程的數(shù)量.
;             pm.min_spare_servers - 處于“空閑”狀態(tài)(等待處理)的最小孩子數(shù)。 ;  
;                           如果 “空閑”進程的數(shù)量少于此數(shù)量,則將創(chuàng)建一些子進程。
;             pm.max_spare_servers - 處于“空閑”狀態(tài)的最大子節(jié)點數(shù)(等待處理)。 
;                       如果“空閑”進程的數(shù)量大于這個數(shù)量,那么一些子進程將被殺死。
;  ondemand - 啟動時不創(chuàng)建子級。當新請求連接時,子進程才會被forked創(chuàng)建.使用以下參數(shù):
;             pm.max_children           - 可以同時活著的子進程的最大數(shù)量。
;             pm.process_idle_timeout   - 空閑進程將被終止的秒數(shù)。
;注意:此值是強制性的。
pm = dynamic

; 當 pm 設置為 'static' 和
; pm 設置為“動態(tài)”或“按需”時的最大子進程數(shù)。
; 此值設置將同時請求的數(shù)量限制
; 服務。 等效于帶有 mpm_prefork 的 ApacheMaxClients 指令。
; 等效于原始 PHP 中的 PHP_FCGI_CHILDREN 環(huán)境變量
; 電腦動畫。 以下默認值基于沒有太多資源的服務器。 別
; 忘記調(diào)整 pm.* 以滿足您的需求。
; 注意:當 pm 設置為“靜態(tài)”、“動態(tài)”或“按需”時使用
; 注意:此值是強制性的。
pm.max_children = 20

; 啟動時創(chuàng)建的子進程數(shù)。
; 注意:僅在 pm 設置為“動態(tài)”時使用
; 默認值:(min_spare_servers + max_spare_servers) / 2
pm.start_servers = 2

; 所需的最小空閑服務器進程數(shù)。
; 注意:僅在 pm 設置為“動態(tài)”時使用
; 注意:當 pm 設置為“動態(tài)”時為必填項
pm.min_spare_servers = 1

; 所需的最大空閑服務器進程數(shù)。
; 注意:僅在 pm 設置為“動態(tài)”時使用
; 注意:當 pm 設置為“動態(tài)”時為必填項
pm.max_spare_servers = 3

; 空閑進程將被殺死的秒數(shù)。
; 注意:僅在 pm 設置為 'ondemand' 時使用
; 默認值: 10s
;pm.process_idle_timeout = 10s;

; 每個子進程在重生之前應執(zhí)行的請求數(shù)。
; 這對于解決 3rd 方庫中的內(nèi)存泄漏問題很有用。 為了
; 無休止的請求處理指定“0”。 等效于 PHP_FCGI_MAX_REQUESTS。
; 默認值: 0
pm.max_requests = 200

; 查看 FPM 狀態(tài)頁面的 URI。 如果未設置此值,則不會有 URI
; 識別為狀態(tài)頁面。 它顯示以下信息:
;   pool                 - 池的名稱
;   process manager      - static, dynamic or ondemand;
;   start time           - FPM 開始的日期和時間;
;   start since          - 自 FPM 開始以來的秒數(shù);
;   accepted conn        - 池接受的請求數(shù);
;   listen queue         - 待處理隊列中的請求數(shù) 連接(參見listen(2)中的積壓任務);
;   max listen queue     - 自 FPM 啟動以來,待處理連接隊列中的最大請求數(shù)
;   listen queue len     - 掛起連接的套接字隊列的大?。?;   idle processes       - 空閑進程的數(shù)量;
;   active processes     - 活動進程的數(shù)量;
;   total processes      - 空閑+活動進程的數(shù)量;
;   max active processes - 自 FPM 啟動以來的最大活動進程數(shù);
;   max children reached - 當 pm 嘗試啟動更多子進程時,已達到進程限制的次數(shù)(僅適用于
;                            pm 'dynamic' 和 'ondemand');
; 值實時更新。
; Example output:
;   pool:                 www
;   process manager:      static
;   start time:           01/Jul/2011:17:53:49 +0200
;   start since:          62636
;   accepted conn:        190460
;   listen queue:         0
;   max listen queue:     1
;   listen queue len:     42
;   idle processes:       4
;   active processes:     11
;   total processes:      15
;   max active processes: 12
;   max children reached: 0
;
; 默認情況下,狀態(tài)頁面輸出格式為 text/plain。 通過任一
; 查詢字符串中的'html'、'xml'或'json'會返回對應的
; output syntax. Example:
;   http://www.foo.bar/status
;   http://www.foo.bar/status?json
;   http://www.foo.bar/status?html
;   http://www.foo.bar/status?xml
;
; 默認情況下,狀態(tài)頁面只輸出簡短的狀態(tài)。 傳遞“完整”
; 查詢字符串還將返回每個池進程的狀態(tài)。
; Example:
;   http://www.foo.bar/status?full
;   http://www.foo.bar/status?json&full
;   http://www.foo.bar/status?html&full
;   http://www.foo.bar/status?xml&full
; 每個進程的完整狀態(tài)返回:
;   pid                  - 進程的PID;
;   state                - 進程的狀態(tài)(空閑,運行,...);
;   start time           - 流程開始的日期和時間;
;   start since          - 自進程開始以來的秒數(shù);
;   requests             - 進程已處理的請求數(shù);
;   request duration     - 請求的持續(xù)時間(以 μs 為單位);
;   request method       - 請求方法(GET,POST,...);
;   request URI          - 帶有查詢字符串的請求 URI;
;   content length       - 請求的內(nèi)容長度(僅限 POST)
;   user                 - 用戶(PHP_AUTH_USER)(如果未設置,則為“-”);
;   script               - 調(diào)用的主腳本(如果未設置,則為“-”);
;   last request cpu     - 如果進程未處于空閑狀態(tài),則最后一個請求消耗的 %cpu 始終為 0,
;                           因為 CPU 計算是在請求處理終止時完成的;
;   last request memory  - 最后一個請求消耗的最大內(nèi)存量,如果進程不處于空閑狀態(tài),
;                           則它始終為 0,因為在請求處理終止時完成了內(nèi)存計算;
; 如果進程處于空閑狀態(tài),則信息與
; 進程服務的最后一個請求。 否則信息與
; 當前正在處理的請求。
; Example output:
;   ************************
;   pid:                  31330
;   state:                Running
;   start time:           01/Jul/2011:17:53:49 +0200
;   start since:          63087
;   requests:             12808
;   request duration:     1250261
;   request method:       GET
;   request URI:          /test_mem.php?N=10000
;   content length:       0
;   user:                 -
;   script:               /home/fat/web/docs/php/test_mem.php
;   last request cpu:     0.00
;   last request memory:  0
;
; 注意:有一個實時 FPM 狀態(tài)監(jiān)控示例網(wǎng)頁可用
; 它位于:/usr/local/php80/share/php/fpm/status.html
;
; 注意:該值必須以斜杠 (/) 開頭。 該值可以是
; 任何東西,但使用 .php 擴展名或它可能不是一個好主意
; 可能與真實的 PHP 文件沖突。
; 默認值: not set
;pm.status_path = /status

; 接受 FastCGI 狀態(tài)請求的地址。 這創(chuàng)造了一個新的
; 可以獨立處理請求的隱形池。 這很有用
; 如果主池忙于長時間運行的請求,因為它仍然可能
; 在完成長時間運行的請求之前獲取狀態(tài)。
;
; 有效的語法是:
;   'ip.add.re.ss:port'    - 在 TCP 套接字上偵聽特定端口上的特定 IPv4 地址;
;   '[ip:6:addr:ess]:port' - 在 TCP 套接字上偵聽特定端口上的特定 IPv6 地址;
;   'port'                 - 在 TCP 套接字上偵聽特定端口上的所有地址(IPv6和IPv4 映射);
;   '/path/to/unix/socket' - 在 Unix 套接字上監(jiān)聽。
; 默認值: value of the listen option
;pm.status_listen = 127.0.0.1:9001

; 調(diào)用FPM監(jiān)控頁面的ping URI。 如果未設置此值,則否
; URI 將被識別為 ping 頁面。 這可以用來從外部測試
; FPM 是活躍的并且正在響應,或者
; - 創(chuàng)建 FPM 可用性圖表(rrd 等);
; - 如果服務器沒有響應(負載平衡),則從組中刪除它;
; - 為運營團隊觸發(fā)警報 (24/7)。
; 注意:該值必須以斜杠 (/) 開頭。 該值可以是
; 任何東西,但使用 .php 擴展名或它可能不是一個好主意
; 可能與真實的 PHP 文件沖突。
; 默認值: not set
;ping.path = /ping

; 該指令可用于自定義 ping 請求的響應。 這
; 響應格式為文本/純文本,響應代碼為 200。
; 默認值: pong
;ping.response = pong

; 訪問日志文件
; Default: not set
;access.log = log/$pool.access.log

; 訪問日志格式。
; 允許使用以下語法
;  %%: the '%' character
;  %C: %CPU used by the request
;      it can accept the following format:
;      - %{user}C for user CPU only
;      - %{system}C for system CPU only
;      - %{total}C  for user + system CPU (default)
;  %d: time taken to serve the request
;      it can accept the following format:
;      - %{seconds}d (default)
;      - %{milliseconds}d
;      - %{mili}d
;      - %{microseconds}d
;      - %{micro}d
;  %e: an environment variable (same as $_ENV or $_SERVER)
;      it must be associated with embraces to specify the name of the env
;      variable. Some examples:
;      - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
;      - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
;  %f: script filename
;  %l: content-length of the request (for POST request only)
;  %m: request method
;  %M: peak of memory allocated by PHP
;      it can accept the following format:
;      - %{bytes}M (default)
;      - %{kilobytes}M
;      - %{kilo}M
;      - %{megabytes}M
;      - %{mega}M
;  %n: pool name
;  %o: output header
;      it must be associated with embraces to specify the name of the header:
;      - %{Content-Type}o
;      - %{X-Powered-By}o
;      - %{Transfert-Encoding}o
;      - ....
;  %p: PID of the child that serviced the request
;  %P: PID of the parent of the child that serviced the request
;  %q: the query string
;  %Q: the '?' character if query string exists
;  %r: the request URI (without the query string, see %q and %Q)
;  %R: remote IP address
;  %s: status (response code)
;  %t: server time the request was received
;      it can accept a strftime(3) format:
;      %d/%b/%Y:%H:%M:%S %z (default)
;      The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
;      e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
;  %T: time the log has been written (the request has finished)
;      it can accept a strftime(3) format:
;      %d/%b/%Y:%H:%M:%S %z (default)
;      The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
;      e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
;  %u: remote user
;
; Default: "%R - %u %t \"%m %r\" %s"
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

; 慢請求的日志文件
; 默認值:未設置
; 注意:如果設置了 request_slowlog_timeout,slowlog 是強制性的
;slowlog = log/$pool.log.slow

slowlog = /data/log/php80/slow.log

; 服務單個請求的超時時間,之后 PHP 回溯將是
; 轉(zhuǎn)儲到“慢日志”文件。 值“0s”表示“關閉”。
; 可用單位:s(econds)(默認)、m(inutes)、h(ours) 或 d(ays)
; 默認值: 0
;request_slowlog_timeout = 0

; 慢日志堆棧跟蹤的深度。
; 默認值: 20
;request_slowlog_trace_depth = 20

; 服務單個請求的超時時間,之后工作進程將
; 被殺。 當 'max_execution_time' ini 選項時應使用此選項
; 由于某種原因不會停止腳本執(zhí)行。 值“0”表示“關閉”。
; 可用單位:s(econds)(默認)、m(inutes)、h(ours) 或 d(ays)
; 默認值: 0
;request_terminate_timeout = 0

; 'request_terminate_timeout' ini 選項設置的超時后未使用
; 應用程序調(diào)用“fastcgi_finish_request”或應用程序完成時
; 正在調(diào)用關閉函數(shù)(通過 register_shutdown_function 注冊)。
; 此選項將啟用無條件應用超時限制
; 即使在這種情況下。
; 默認值: no
;request_terminate_timeout_track_finished = no

; 設置打開文件描述符 rlimit。
; 默認值: system defined value
;rlimit_files = 1024

; 設置最大核心尺寸 rlimit。
; 可能的值:“無限”或大于或等于 0 的整數(shù)
; 默認值: system defined value
;rlimit_core = 0

; chroot 到這個目錄開始。 該值必須定義為
; 絕對路徑。 如果未設置此值,則不使用 chroot。
; 注意:您可以使用 '$prefix' 作為前綴來 chroot 到池前綴或一個
; 的子目錄。 如果未設置池前綴,則使用全局前綴
; 將被使用。
; 注意:chrooting 是一個很好的安全功能,應該在任何時候使用
; 可能的。 但是,所有 PHP 路徑都將相對于 chroot
; (error_log,sessions.save_path,...)。
; 默認值: not set
;chroot =

; chdir 到這個目錄開始。
; 注意:可以使用相對路徑。
; 默認值: current directory or / when chroot
;chdir = /var/www

; 將工作人員標準輸出和標準錯誤重定向到主錯誤日志。 如果未設置,stdout 和
; 根據(jù) FastCGI 規(guī)范,stderr 將被重定向到 /dev/null。
; 注意:在高負載環(huán)境下,這可能會導致頁面延遲
; 處理時間(幾毫秒)。
; 默認值: no
;catch_workers_output = yes

; 使用包含有關信息的前綴和后綴裝飾工作人員輸出
; 寫入日志的孩子以及是否使用了 stdout 或 stderr
; 日志級別和時間。 僅當 catch_workers_output 為 yes 時才使用此選項。
; 設置為“no”將輸出寫入 stdout 或 stderr 的數(shù)據(jù)。
; 默認值: yes
;decorate_workers_output = no

; FPM 工作人員的清晰環(huán)境
; 防止任意環(huán)境變量到達 FPM 工作進程
; 通過在此指定的環(huán)境變量之前清除工作人員中的環(huán)境
; 添加池配置。
; 設置為“no”將使所有環(huán)境變量都可用于 PHP 代碼
; 通過 getenv()、$_ENV 和 $_SERVER。
; 默認值: yes
;clear_env = no

; 限制 FPM 允許解析的主腳本的擴展。 這個可以
; 防止Web服務器端的配置錯誤。 你應該只限制
; FPM轉(zhuǎn).php擴展名,防止惡意用戶使用其他擴展名
; 執(zhí)行php代碼。
; 注意:設置一個空值以允許所有擴展。
; 默認值: .php
;security.limit_extensions = .php .php3 .php4 .php5 .php7

; 傳遞環(huán)境變量,如 LD_LIBRARY_PATH。 所有 $VARIABLEs 都取自
; 當前環(huán)境。
; 默認值: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

; 附加的 php.ini 定義,特定于這個工人池。 這些設置
; 覆蓋之前在 php.ini 中定義的值。 這些指令是
; 與 PHP SAPI 相同:
;   php_value/php_flag       - 您可以設置可以從 PHP 調(diào)用 'ini_set' 覆蓋的經(jīng)典 ini 定義。
;   php_admin_value/php_admin_flag - 這些指令不會被 PHP 調(diào)用 'ini_set' 覆蓋
; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.

; 定義“擴展”將加載相應的共享擴展
; 擴展目錄。 定義 'disable_functions' 或 'disable_classes' 不會
; 覆蓋以前定義的 php.ini 值,但會附加新值
; 反而。

; 注意:路徑 INI 選項可以是相對的,并且將使用前綴進行擴展
; (pool, global or /usr/local/php80)

; 默認值:除了 php.ini 和
; 在啟動時使用 -d 參數(shù)指定
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;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

最后談幾點關于配置fpm的線程池的問題:

  1. pm的配置模式是 static dynamic ondemand哪個最好,是根據(jù)你的業(yè)務模式需求來定,你可以通過fpm的slowlog,access.log /status 來判斷那種適合你的業(yè)務系統(tǒng),比如查詢多的業(yè)務,需要大量計算,比如需要很多其他組件通信有延遲的,各種各樣的業(yè)務,通過不斷嘗試選擇最適合自己的
  2. 有沒有最優(yōu)解? 沒有最優(yōu)解,只能建議:static適合大并發(fā),整體請求平穩(wěn)的,dynamic適合請求變化大,但是總體請求并不大,ondemand適合對fpm并不清楚怎么配置,最簡單
  3. fpm配合opcache使用性能并不差,慢的原因多半是因為框架本身很重,多使用緩存來提供熱數(shù)據(jù)查詢,不要頻繁直接把請求打到數(shù)據(jù)層,寫入才做保證原子性操作盡量少使用鎖,多用事務,頻繁使用鎖會造成數(shù)據(jù)庫的阻塞,數(shù)據(jù)庫的返回越慢,也會拖慢fpm的返回,因為php的大部分請求都是阻塞的,當然現(xiàn)在也有很多異步非阻塞的框架。
    2022年10月12日15:12:39 補充幾點
  4. 并不是worker線程開的越多越好,要適當冗余硬件資源給系統(tǒng),因為fpm沒有做cpu親和性,太多的執(zhí)行worker線程,cpu要瘋狂的切換cpu執(zhí)行的上下文,一般8核16G內(nèi)存,開200-220比較適合,建議最好開啟max_requests,適當釋放內(nèi)存給系統(tǒng),避免系統(tǒng)跑一段時間系統(tǒng)資源越來越少,變得卡頓,因為現(xiàn)在多數(shù)都是虛擬服務器,8核16G內(nèi)存實際性能就損失了大約5%,如果你在同樣配置的硬件機器和虛擬服務器性能測試,硬件服務器會比虛擬服務器性能好10%-20%,比如騰訊,阿里的服務器都存在這個問題,有時間可以做下壓測就知道了,比如服務器分通用型 計算型 內(nèi)存型大 數(shù)據(jù)型 GPU型 本地SSD型 高主頻型 FPGA型 彈性裸金屬型都是在婉轉(zhuǎn)的告訴性能差距
4060 5 11
5個評論

PHP甩JAVA一條街

請問webman是什么原理呢?老大寫的比較籠統(tǒng)

  • zh7314 2023-06-20

    本質(zhì)和webman基本一樣,但是workerman是基于php實現(xiàn)的,不需要在吧請求由fpm轉(zhuǎn)給php執(zhí)行,直接由nginx交給workerman

喵了個咪

絕對好文

  • 暫無評論
lcmg

厲害了

  • 暫無評論
初心by

  • 暫無評論
charlescc

這個很詳細,好文。

  • 暫無評論
年代過于久遠,無法發(fā)表評論

zh7314

790
積分
0
獲贊數(shù)
0
粉絲數(shù)
2021-12-13 加入
??