关于这个问题你可以去阅读一下 http://tengine.taobao.org/book/chapter_04.html 过滤模块。 我说一下我的理解: 1)ngx_http_send_header和ngx_http_output_filter的一个理解: 在Nginx中发送HTTP响应的两个方法是ngx_http_send_header和ngx_http_output_filter方法。这两个方法负责把HTTP响应中的响应行、头部、响应体发送给客户端。 其中ngx_http_send_header是处理响应行和头部的filter的第一个模块,而ngx_http_output_filter是处理响应体的filter的第一个模块。其实可以这样来理解(这儿实际上不是链表):头部过滤模块有一个链表,链表中每一个元素都是一个filter处理模块,而这个链表的链表头是ngx_http_send_header;同理,响应体过滤模块的链表的链表头是ngx_http_output_filter。 如果你将ngx_http_send_header和ngx_http_output_filter删除,那么就没有办法将数据发送给客户端了。 2)关于异步处理: 我们知道是通过ngx_http_writer方法发送响应的,通过源码可以看到 在结束请求的ngx_http_finalize_request方法中 会将请求的write_event_handler设置为ngx_http_writer方法,并且会将写事件添加到定时器和Epoll中(如下部分源码),这样就实现了在后台异步的发送响应。if (r != r->main) { if (r->buffered || r->postponed) { if (ngx_http_set_write_handler(r) != NGX_OK) { ngx_http_terminate_request(r, 0); } return; }
Hello! 2013/4/23 司馬迎風 > > 谢谢!那照这么说的话,应该有个flag来控制响应输出的,应该是哪个呢?我如何在模块中对这个flag进行设置,以阻止他响应;待 > 功能函数完成事件到来之后,我再设置该回应flag,从而实现对客户端可控的异步响应? > 通过在你自己的 content handler 中加上下面这两行 r->main->count++; return NGX_DONE; 可以避免 nginx 立即结束当前请求。 待后续你所期望的 I/O 事件发生以后,你可以再输出响应头(以及响应体),最后通过下面这一行结束当前请求: ngx_http_finalize_request(r, NGX_OK); 不过此时你同时需要确保下面的条件满足: r->connection->data == r 即 r 是当前的活动请求(active request)。 Regards, -agentzh
没懂你的意思。功能函数是什么意思