学习记录 留作参考
祝君好运
php-cli, php-cgi, fastcgi, php-fpm
php-cli
Command Line Interface 命令行接口
php-cli在命令行下面直接运行php,这个时候php的生命周期也就是脚本结束了,php的生命周期也就over了。
目前,CLI模式下执行php脚本的情况比较少,究其原因是无法满足复杂的业务需要,也不能传递post参数、上传文件,ui交互较差,更适合开发人员使用。
php-cgi
Common Gateway Interface 公共网关接口
php-cgi就是一个协议(与http一样),是一种与语言无关的协议,规定传输哪些数据、以什么样的格式传递给后方处理的一个协议,然后php就会启动解析器,初始化环境,然后处理请求,退出程序。
php-cgi的大致工作流程如下:
- 初始化 php 的各种变量
- 调用并初始化 zend 虚拟机
- 加载并解析 php.ini
- 激活 zend
- zend 加载 a.php ,并做词法/语法分析
- 编译 a.php 为 opcode ,并执行
- 输出结果
- 关闭 zend 虚拟机
- 返回结果给 web server (nginx 、apache)
CGI 模式也称为 fork-execute-kill 模式:每当有一个请求过来时, web server 都会启动一个 php-cgi 去处理这个请求。请求完成之后,php-cgi 就会自动销毁。对于 QPS 较小的情况下,没问题。但是对于大量的 QPS 时,这个响应就会比较慢。因为 web server 在创建一个 php-cgi 时,都要给其分配内存和其他资源,QPS较大时,就会造成资源紧张,从而造成响应变长。
cgi 解释器的反复加载是 cgi 性能低下的主要原因。
fastcgi
fastcgi 也是一种协议。fastcgi 是 cgi 的升级版,提升点在 php-cgi预生成 与 常驻内存。
预生成:在请求达到 php-cgi 之前就生成一定数量的 php-cgi 。
常驻内存:php-cgi 在处理过一个请求之后并不会销毁,它会一直存在,等待着下一个php-fpm 分配下一个请求。
因为是预生成了一定数量的 php-cgi ,所以当 web server 转发过来了一个请求,如果每个 php-cgi 都尝试处理,就会造成 ”惊群效应“ ,于是就需要一个管理器进行调度它们,这个管理器,就是 php-fpm 。
fastcgi 优点:工作效率非常高。
fastcgi 缺点:因为是多进程,所以 cgi 多线程会消耗服务器更多的内存。
php-fpm
php-fpm 是 php-cgi 的进程管理器。(这是一个实现了 fastcgi 协议的程序)
cgi 协议时,php-cgi 的启动是受 web server 控制的;
fastcgi 协议时,php-cgi 的启动跟web server 就没关系了,只受 php-fpm 的调度。
当 web server 转发来了一些请求时,需要先经过 php-fpm 的调度,之后再由 php-fpm 控制这个请求具体交给哪个 php-cgi 处理。
php-fpm.conf
这是php-fpm的配置文件。
配置子进程数量
在该文件内可以配置php-fpm的子进程数量,以及子进程的管理方式。
pm = static
dynamic
ondemand
相关配置文件内容如下:
; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
采用固定的子进程数量,可以提高性能,但是会占用大量内存-如果配置进程数过多,会占用90%以上内存。
可能需要经常重启来释放内存。
; dynamic - the number of child processes are set dynamically based on the
; following directives. With this process management, there will be
; always at least 1 children.
动态的子进程数量,可以平衡性能与内存占用。需要注意下面的配置项。
; pm.max_children - the maximum number of children that can
; be alive at the same time.
; pm.start_servers - the number of children created on startup.
; pm.min_spare_servers - the minimum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is less than this
; number then some children will be created.
; pm.max_spare_servers - the maximum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is greater than this
; number then some children will be killed.
; ondemand - no children are created at startup. Children will be forked when
; new requests will connect. The following parameter are used:
按需配置,用的比较少。
; pm.max_children - the maximum number of children that
; can be alive at the same time.
; pm.process_idle_timeout - The number of seconds after which
; an idle process will be killed.
; Note: This value is mandatory.
pm = dynamic
; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI. The below defaults are based on a server without much resources. Don't
; forget to tweak pm.* to fit your needs.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
; Note: This value is mandatory.
pm.max_children = 256
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 40
; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 20
; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 60
配置 pm.max_children
时,可以按照每个php-fpm进程占用20~30MB内存大小来计算。当 pm=static
时,子进程的数量不宜过多,否则会造成占用大量内存,可能会使服务器内存占用一直90%+,存在隐患。
配置php-fpm状态页
php-fpm内置了一个状态页,需要通过修改配置文件来开启,展示了当前php-fpm的一些信息。
php-fpm.conf 配置项如下:
pm.status_path = /status
该配置项一般都是注释状态,根据自己的需要开启即可。也可以修改成其他访问路径
配置状态页的步骤:
-
开启
php-fpm.conf
内pm.status_path
的配置项,并重启php-fpm。 -
增加nginx相关站点配置文件一个解析条件,之后重启nginx:
location = /status { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
-
通过浏览器访问
http://xxx.com/status
即可查看php-fpm的状态页。后面也有可选参数:http://xxx.com/status
http://xxx.com/status?json
,返回json格式内容http://xxx.com/status?html
,返回html格式内容http://xxx.com/status?xml
,返回xml格式内容http://xxx.com/status?full
,可以展示全部子进程的运行情况
状态页的展示内容效果如下:
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 //FPM启动后最大活跃子进程数量,可以作为配置子进程数量的一个参考值。
max children reached: 0
参考内容:Nginx开启php-fpm状态页及状态详解-腾讯云开发者社区-腾讯云
标签:cgi,php,FPM,配置,number,fpm,PHP,children,pm From: https://www.cnblogs.com/liulog/p/18561220