一:概述php
- FPM 定义html
- FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器。web
- FastCGIshell
- Web服务器(如:Nginx、Apache)和处理程序之间的一种通讯协议。服务器
- 注意:它只是一种协议!(与HTTP协议相似)网络
- 具体请戳 《PHP - CGI/Fastcgi/PHP-FPM》socket
二:FPM 的做用函数
- PHP只是一个脚本解析器,咱们能够把它理解为一个普通的函数,输入是PHP脚本。输出是执行结果。工具
- 假如咱们想用PHP代替shell,在命令行中执行一个文件,那么就能够写一个程序来嵌入PHP解析器,这就是cli模式,这种模式下PHP就是普通的一个命令工具。spa
- 接着咱们又想:能不能让PHP处理http请求呢?这时就涉及到了网络处理,PHP须要接收请求、解析协议,而后处理完成返回请求。
- 在网络应用场景下,PHP并无像Golang那样实现http网络库,而是实现了FastCGI协议,而后与web服务器配合实现了http的处理,web服务器来处理http请求。
- 而后将解析的结果再经过FastCGI协议转发给处理程序,处理程序处理完成后将结果返回给web服务器,web服务器再返回给用户。
-
三:FPM 的实现
- FPM 的实现就是建立一个 master 进程,在 master 进程中建立并监听socket,而后 fork 出多个子进程,这些子进程各自 accept 请求.
- 子进程的处理很是简单,子进程启动后阻塞在accept上,有请求到达后开始读取请求数据,读取完成后开始处理而后再返回
- 在子进程处理期间是不会接收其它请求的,也就是说fpm的子进程同时只能响应一个请求,只有把这个请求处理完成后才会accept下一个请求
- fpm的master进程与worker进程之间不会直接进行通讯,master经过共享内存获取worker进程的信息,好比worker进程当前状态、已处理请求数等
- 当master进程要杀掉一个worker进程时则经过发送信号的方式通知worker进程。
- 具体实现上 是 多个worker pool组成一个单链表:
四:请求处理
- 流程就是worker进程不断accept请求,而后执行PHP脚本并返回
- 总体流程
- (1)等待请求: worker进程阻塞在fcgi_accept_request()等待请求;
- (2)解析请求: fastcgi请求到达后被worker接收,而后开始接收并解析请求数据,直到request数据彻底到达;
- (3)请求初始化: 执行php_request_startup(),此阶段会调用每一个扩展的:PHP_RINIT_FUNCTION();
- (4)编译、执行: 由php_execute_script()完成PHP脚本的编译、执行;
- (5)关闭请求: 请求完成后执行php_request_shutdown(),此阶段会调用每一个扩展的:PHP_RSHUTDOWN_FUNCTION(),而后进入步骤(1)等待下一个请求。