Hello!
2014-12-09 18:57 GMT-08:00 学不可以已:
> 1、我是想着,如果我是一个非常大的文件,比如1G,在网络状况一般的情况下,吐数据的时间大概也会花个几秒甚至几十秒,那么我说的方案(在请求NGX_HTTP_POST_READ_PHASE阶段通过ngx_add_timer添加个定时器事件,比如1秒。1秒打印一次r-connection->sent数据。)是否可行呢?
可行。只要你的输出过程不是全阻塞的。只要 nginx 的事件循环有机会运行,你自己的 timer 就有机会 expire.
> 可是我尝试的时候,比如curl下载这个1G的文件,发现下载数据完后,定时器才开始工作的感觉。
由于你没有提供具体的代码和描述,我这里只能猜测了。有几种你犯错的可能:
1. 你错误地复用了 nginx 自己的 ngx_event_t,比如 r->connection->read 或
r->connection->write. 这些 event 上的 timer 会频繁地被改写。
2. 你的输出过程没有使用 non-buffered 模式,比如 ngx_proxy 模块有 non-buffered 模式(不过默认是全
buffered 模式)。
3. 你的 timer 应该在你自己的 requst pool cleanup 回调里进行回收释放。注意,不应在 request cleanup 里回收。
> 2、如果通过nginx模块的方法来实现我这个需求,你的建议是怎么实现好呢?谢谢~
>
你自己写 nginx 模块有 N 种犯错的可能性。我上面猜的只是你这里最可能犯的几种。
建议直接使用 ngx_lua 模块的 body_filter_by_lua 指令来作这种统计:
https://github.com/openresty/lua-nginx-module#body_filter_by_lua
你可以在里面检查 ngx.now() 来判断时间。
Regards,
-agentzh