php-fpm       

php-fpm

FPM 的 master 进程接收到请求

master 进程根据配置指派特定的 worker 进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合 Nginx 遇到502错误比较多的原因

worker 进程处理请求,如果超时,返回504错误

请求处理结束,返回结果

woker

fpm_run()执行后将 fork 出 worker 进程,worker 进程返回main()中继续向下执行,后面的流程就是 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) 等待下一个请求。

FPM_REQUEST_ACCEPTING: 等待请求阶段

FPM_REQUEST_READING_HEADERS: 读取 fastcgi 请求 header 阶段

FPM_REQUEST_INFO: 获取请求信息阶段,此阶段是将请求的 method、query stirng、request uri 等信息保存到各 worker 进程的 fpm_scoreboard_proc_s 结构中,此操作需要加锁,因为 master 进程也会操作此结构

FPM_REQUEST_EXECUTING: 执行请求阶段

FPM_REQUEST_END: 没有使用

FPM_REQUEST_FINISHED: 请求处理完成