PHP-FPM

1、FPM是什么?

FPM(FastCGI 进程管理器)是 PHP FastCGI 的主要实现,实现了许多对高负载网站有用的功能。FPM 管理多个 PHP 进程,并通过 FastCGI 协议与 Web 服务器通信,提供更好的性能和资源管理。一般 nginx 服务器使用FPM。

PHP-FPM使用了多进程模型来处理PHP请求。当Web服务器接收到一个PHP请求时,它将该请求转发给PHP-FPM进程管理器。PHP-FPM会根据配置文件中的参数来创建、管理和回收PHP解释器进程(也称为worker进程),并将请求分配给这些worker进程来处理。这种多进程模型使得PHP-FPM能够处理大量并发请求,并提高PHP应用程序的性能和稳定性。

2、一下是FPM的工作流程:

  1. Web服务器接收到一个包含PHP请求的HTTP请求。
  2. Web服务器将该请求转发给PHP-FPM进程管理器。
  3. PHP-FPM进程管理器接收到请求后,从空闲进程池中选择一个worker进程来处理该请求。如果没有空闲进程,则根据配置文件中的参数决定是否要创建新的worker进程。
  4. 选定的worker进程接收到请求后,会解析PHP代码并执行相应的操作。它可以连接数据库、进行文件读写、生成HTML等。
  5. worker进程将处理结果返回给PHP-FPM进程管理器。
  6. PHP-FPM进程管理器将处理结果返回给Web服务器。
  7. Web服务器将最终结果返回给客户端。

在整个工作流程中,PHP-FPM进程管理器负责管理worker进程的生命周期。它会监控进程的状态,并根据需要创建或回收worker进程,以确保有足够的进程来处理请求并避免资源浪费。

此外,PHP-FPM还提供了一些额外的功能,如进程池分配、连接池管理、动态进程调整等,以优化PHP应用程序的性能和可靠性。

3、进程管理相关配置

pm string

设置进程管理器如何管理子进程。可用值:staticondemanddynamic。必须设置。

static - 子进程的数量是固定的(pm.max_children)。

ondemand - 进程在有需求时才产生(当请求时才启动。与 dynamic 相反,在服务启动时 pm.start_servers 就启动了。

dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers

pm.max_children int

pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量。必须设置。

该选项设置可以同时提供服务的请求数限制。类似 Apache 的 mpm_prefork 中 MaxClients 的设置和 普通PHP FastCGI中的 PHP_FCGI_CHILDREN 环境变量。

pm.start_servers in

设置启动时创建的子进程数目。仅在 pm 设置为 dynamic 时使用。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。

pm.min_spare_servers int

设置空闲服务进程的最低数目。仅在 pm 设置为 dynamic 时使用。必须设置。

pm.max_spare_servers int

设置空闲服务进程的最大数目。仅在 pm 设置为 dynamic 时使用。必须设置。

pm.max_spawn_rate int

同时生成子进程的速率。仅当 pm 设置为 dynamic 时使用。默认值: 32

pm.process_idle_timeout mixed

秒数,多久之后结束空闲进程。 仅当设置 pmondemand。 可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:10s。

pm.max_requests int

设置每个子进程重生之前服务的请求数。对于可能存在内存泄漏的第三方模块来说是非常有用的。如果设置为 '0' 则一直接受请求,等同于 PHP_FCGI_MAX_REQUESTS 环境变量。默认值:0。

pm.status_listen string

接受 FastCGI 状态请求的地址。会创建一个新不可见池用来独立处理请求。如果主池处理长时间运行的请求时很繁忙, 那么对长时间运行的请求结束之前能够获得 FPM 状态页面会非常有用。语法与 listen 指令相同。默认值:none。

pm.status_path string

查看 FPM 状态页面的 URI。此值必须以斜线(/)开头。如果没有设置,则无法访问状态页面,默认值:无。

相关推荐
Swift社区2 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht2 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht2 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20242 小时前
Swift 数组
开发语言
stm 学习ing3 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc4 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe5 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin5 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python