5.5.3 子请求如何激活父请求

子请求在结束前会回调在ngx_http_post_subrequest_t中实现的handler方法(见5.4.2节),在这个handler方法中,又设置了父请求被激活后的执行方法mytest_post_handler,流程如图5-8所示。

5.5.3 子请求如何激活父请求 - 图1

图 5-8 子请求激活父请求过程的序列图

下面简单地介绍一下图5-8中的每一个步骤:

1)Nginx主循环中会定期地调用事件模块,检查是否有网络事件发生。

2)如果事件模块检测到连接关闭事件,而这个请求的处理方法属于upstream模块,则交由upstream模块来处理请求。

3)upstream模块开始调用ngx_http_upstream_finalize_request方法来结束upstream机制下的请求(详见12.9节)。

4)调用HTTP框架提供的ngx_http_finalize_request方法来结束子请求。

5)ngx_http_finalize_request方法会检查当前的请求是否是子请求,如果是子请求,则会回调post_subrequest成员中的handler方法(参见图11-26中的第5步),也就是会调用mytest_subrequest_post_handler方法(见5.6.3节)。

6)在实现的子请求回调方法中,解析子请求返回的响应包。注意,这时需要通过write_event_handler设置父请求被激活后的回调方法(因为此时父请求的回调方法已经被HTTP框架设置为什么事都不做的ngx_http_request_empty_handler方法,详见第11章)。

7)子请求的回调方法执行完毕后,交由HTTP框架的ngx_http_finalize_request方法继续向下执行。

8)ngx_http_finalize_request方法执行完毕。

9)HTTP框架如果发现当前请求后还有父请求需要执行,则调用父请求的write_event_handler回调方法。

10)这里可以根据第6步中解析子请求响应后的结果来构造响应包。

11)调用无阻塞的ngx_http_send_header、ngx_http_output_filter发送方法,向客户端发送响应包。

12)无阻塞发送方法会立刻返回。即使目前未发送完,Nginx之后也会异步地发送完所有的响应包,然后再结束请求。

13)父请求的回调方法执行完毕。

14)当第2步中的上游服务器连接关闭事件处理完毕后,交还控制权给事件模块。

15)当本轮网络事件处理完毕后,交还控制权给Nginx主循环。