深入理解SAPI之FPM
2021-08-27 14:29:20 小德 PHP 访问次数 115

PHP处理HTTP请求涉及网络处理、需求接受,请求解析,处理完成后返回,实现了FastCGI协议。web服务器处理网络请求将解析的结果通过FastCGI协议转发给处理程序,处理程序完成后将结果返回。Fpm就是PHP FastCGI运行模式的进行管理器。

网络处理模型:

    1、多进程模型:由一个主进程负责管理子进程,基本网络事件由各个子进程处理,nginx

    2、多线程模型:主线程负责管理子线程,子线程监听,接受处理请求。

    进程拥有独立的地址空间和资源,线程之间共享进程的地址空间和资源,多进程模型管理资源比较简单,多线程需考虑不同线程之间的资源冲突。

一、基本实现

Fpm,有一个master进程和多个worker进程组成,master启动时创建一个socket,但是不会接受、处理请求,而是由fork出的子进程完成请求的接收。master主要负责fork和杀掉子进程。

worker工作是处理请求,竞争Accept请求,接受成功后解析fastCGI,然后执行对应的脚本,处理完成后关闭请求,继续等待新的连接。一个worker只能处理一个请求,只有请求完成后才会处理下一个请求。与nginx的事件模型有很大区别,这种模式简化了PHP的资源管理,不用考虑并发冲突

master和worker之前不会直接进行通信,master通过共享内存获取worker进程的信息。master通过发送信号管理worker.

fpm可以同时监听多个端口,每个端口对应一个worker pool 每个pool对应多个worker,类型nginx 与server,归属不同的pool的worker 仍由一个master管理。POOL之间是一个链表结构。

二、master的进行管理

1、静态模式:启动master时根据配置fork响应的worker进程,也就是worker进程数固定不变

2、动态模式:常用,Fpm启动时根据配置初始化一定数量的worker,运行期间内发现空闲 kill worker  不够 fork worker.

3、按需模式:启动时不分配worker,有了请求后再通知master fork worker ,处理完成后不会立即退出,空闲时间超过配置后再退出