fpm_run()
执行后将fork出worker进程,worker进程返回main()
中继续向下执行,后面的流程就是worker进程不断accept请求,然后执行PHP脚本并返回。整体流程如下:
(5)关闭请求: 请求完成后执行php_request_shutdown(),此阶段会调用每个扩展的:PHP_RSHUTDOWN_FUNCTION(),然后进入步骤(1)等待下一个请求。
int main(int argc, char *argv[])
{ ... fcgi_fd = fpm_run(&max_requests); parent = 0;
//初始化fastcgi请求 request = fpm_init_request(fcgi_fd);
//worker进程将阻塞在这,等待请求 while (EXPECTED(fcgi_accept_request(request) >= 0)) { SG(server_context) = (void *) request; init_request_info();
//请求开始 if (UNEXPECTED(php_request_startup() == FAILURE)) { ... } ...
fpm_request_executing(); //编译、执行PHP脚本 php_execute_script(&file_handle); ... //请求结束 php_request_shutdown((void *) 0); ... } ... //worker进程退出 php_module_shutdown(); ... }
worker进程一次请求的处理被划分为5个阶段:
worker处理到各个阶段时将会把当前阶段更新到fpm_scoreboard_proc_s->request_stage
,master进程正是通过这个标识判断worker进程是否空闲的。