11.10.3 ngx_http_close_request

ngx_http_close_request方法是更高层的用于关闭请求的方法,当然,HTTP模块一般也不会直接调用它的。在上面几节中反复提到的引用计数,就是由ngx_http_close_request方法负责检测的,同时它会在引用计数清零时正式调用ngx_http_free_request方法和ngx_http_close_connection方法来释放请求、关闭连接。先来看看图11-24中列出的ngx_http_close_request方法所做的工作。

11.10.3 ngx_http_close_request - 图1

图 11-24 ngx_http_close_request方法的流程图

下面简单说明一下ngx_http_close_request方法所做的工作。

1)首先,由ngx_http_request_t结构体的main成员中取出对应的原始请求(当然,可能就是这个请求本身),再取出count引用计数并减1。然后,检查count引用计数是否已经为0,以及blocked标志位是否为0。如果count已经为0,则证明请求没有其他动作要使用了,同时blocked标志位也为0,表示没有HTTP模块还需要处理请求,所以此时请求可以真正释放,这时跳到第2步执行;如果count引用计数大于0,或者blocked大于0,这样都不可以结束请求,ngx_http_close_request方法直接结束。

2)调用ngx_http_free_request方法释放请求。

3)调用ngx_http_close_connection方法关闭连接。

注意 在官方发布的HTTP模块中,ngx_http_request_t结构体中的blocked标志位主要由异步I/O使用,ngx_http_close_request方法正是通过blocked配合着异步I/O工作,如果AIO上下文中还在处理这个请求,blocked必然是大于0的,这时ngx_http_close_request方法不能结束请求。由于本章不涉及异步AIO,所以略过不提。