Hello!
2014-07-09 6:09 GMT-07:00 王博:
> 我用ngx_lua的thread实现了bigpipe,大致效果就是:一次客户端请求,服务端同时渲染多个数据块,哪个渲染好了哪个就先flush到客户端。
> 这本身都没有什么问题,但我现在遇到的问题是:在chunked/gzip的环境下,客户端似乎只能拿到所有的gzip数据后再一起解压缩,而不能按照chunk来分块解压缩,但如果这样,我的bigpipe机制就失去了意义,感觉上gzip应该是可以流式解析的,请大家帮忙指明我是不是哪里做错了
>
这取决于你使用的具体的客户端。即使是支持流式解析的客户端,也可能自己有较大的 buffer,所以只有输出足够大的数据量时才能看出流式输出的行为。
比如在我这里 curl 这个命令行客户端就可以很方便地测试基于 chunked 的流式输出行为。考虑下面这个最小化的例子:
listen 8080;
gzip on;
gzip_min_length 1;
gzip_types text/plain;
location = /t {
default_type text/plain;
content_by_lua '
for i = 1, 10 do
ngx.say("hello ", i)
ngx.flush(true)
ngx.sleep(1)
end
';
}
使用 curl 在我这里得到下面的输出:
curl -i --compressed localhost:8080/t
HTTP/1.1 200 OK
Server: nginx/1.7.2
Date: Wed, 09 Jul 2014 18:55:28 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
Content-Encoding: gzip
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
hello 10
最后的 10 行输出是期望中的每隔一秒打印一下。
Regards,
-agentzh