在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一:概述 - FPM 定义 - FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器。 - FastCGI - Web服务器(如:Nginx、Apache)和处理程序之间的一种通信协议。 - 注意:它只是一种协议!(与HTTP协议类似) - 具体请戳 《PHP - CGI/Fastcgi/PHP-FPM》
二:FPM 的作用 - PHP只是一个脚本解析器,我们可以把它理解为一个普通的函数,输入是PHP脚本。输出是执行结果。 - 假如我们想用PHP代替shell,在命令行中执行一个文件,那么就可以写一个程序来嵌入PHP解析器,这就是cli模式,这种模式下PHP就是普通的一个命令工具。 - 接着我们又想:能不能让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)等待下一个请求。
|
2022-08-30
2022-08-17
2022-11-06
2022-08-14
2022-08-18
请发表评论