上下文与全异步web服务器的关系
请求上下文指在一个请求的处理过程中,把一些关键的信息保存下来的类似struct这样的结构体。每个http模块都可以有自己的上下文结构体,一般都是在刚开始处理请求时在内存池上分配它,之后当经由epoll、http框架再次调用到http模块的处理方法时,这个http模块可以由请求上下文结构体中获取信息。请求结束时就会销毁该请求的内存池,自然也就销毁了上下文结构体。
Nginx是全异步处理的web服务器,http模块可能会多次反复处理同一个请求,所以必须定义上下文结构体来保存处理过程的中间状态。Nginx框架不会维护这个上下文,只能由这个请求自己保存着上下文结构体。
使用http上下文
#define ngx_http_get_modult_ctx(r,module)(r)->ctx[module.ctx_index]
#define ngx_http_set_ctx(r,c,module) r-ctx(module.ctx_index)=c;
ngx_http_get_module_ctx接受两个参数,第一个参数为ngx_http_request_t指针,第二个参数是当前的http模块对象。返回值是某个http模块的上下文结构体指针。如果这个http模块没有设置过上下文,将会返回NULL 。
ngx_http_set_ctx接受三个参数,第一个参数是ngx_http_request_t指针,第二个参数是准备设置的上下文结构体的指针,第三个参数是http模块对象。
http框架如何维护上下文结构
typedef struct ngx_http_request_s
{
...
void **ctx;
...
}ngx_http_request_t;
http框架在ctx数组中保存所有http模块上下文结构体的指针。
【Nginx】请求上下文