5.4.4 启动subrequest子请求

在ngx_http_mytest_handler处理方法中,可以启动subrequest子请求。首先调用ngx_http_subrequest方法建立subrequest子请求,在ngx_http_mytest_handler返回后,HTTP框架会自动执行子请求。先看一下ngx_http_subrequest的定义:


ngx_int_t

ngx_http_subrequest(ngx_http_request_t*r,

ngx_str_turi,ngx_str_targs,ngx_http_request_t**psr,

ngx_http_post_subrequest_t*ps,ngx_uint_t flags);


下面依次介绍ngx_http_subrequest中的参数和返回值。

(1)ngx_http_request_t*r

ngx_http_request_t*r是当前的请求,也就是父请求。

(2)ngx_str_t*uri

ngx_str_t*uri是子请求的URI,它对究竟选用nginx.conf配置文件中的哪个模块来处理子请求起决定性作用。

(3)ngx_str_t*args

ngx_str_t*args是子请求的URI参数,如果没有参数,可以传送NULL空指针。

(4)ngx_http_request_t**psr

psr是输出参数而不是输入参数,它将把ngx_http_subrequest生成的子请求传出来。一般,我们先建立一个子请求的空指针ngx_http_request_t*psr,再把它的地址&psr传入到ngx_http_subrequest方法中,如果ngx_http_subrequest返回成功,psr就指向建立好的子请求。

(5)ngx_http_post_subrequest_t*ps

这里传入5.4.2节中创建的ngx_http_post_subrequest_t结构体地址,它指出子请求结束时必须回调的处理方法。

(6)ngx_uint_t flags

flag的取值范围包括:①0。在没有特殊需求的情况下都应该填写它;②NGX_HTTP_SUBREQUEST_IN_MEMORY。这个宏会将子请求的subrequest_in_memory标志位置为1,这意味着如果子请求使用upstream访问上游服务器,那么上游服务器的响应都将会在内存中处理;③NGX_HTTP_SUBREQUEST_WAITED。这个宏会将子请求的waited标志位置为1,当子请求提前结束时,有个done标志位会置为1,但目前HTTP框架并没有针对这两个标志位做任何实质性处理。注意,flag是按比特位操作的,这样可以同时含有上述3个值。

(7)返回值

返回NGX_OK表示成功建立子请求;返回NGX_ERROR表示建立子请求失败。

ngx_http_mytest_handler处理方法的返回值依然与upstream机制相同,它也必须返回NGX_DONE,原因也是相同的。