Hello!
2013/2/5 melon198502:
> 请问通过ngx.req.socket获取的socket是个和ngx.print响应输出时所用的套接字是一样的吗?
在 C 级别上是一个 socket :)
> 因为我在调用receive函数接收数据的时候,第一次调用超时之后再次调用就会产生返回closed连接已关闭,然后连接就关闭了,查看nginx日志输出了如下内容:
> 2013/02/06 09:27:24 [error] 7875#0: *1 lua tcp socket read timed out,
> client: 127.0.0.1, server: localhost, request: "GET /lua HTTP/1.1", host:
> "localhost"
> 2013/02/06 09:27:25 [error] 7875#0: *1 attempt to receive data on a closed
> socket: u:0000000040427BA8, c:0000000000000000, ft:2 eof:0, client:
> 127.0.0.1, server: localhost, request: "GET /lua HTTP/1.1", host:
> "localhost"
> 但是我用curl测试时并有手动断开连接,莫非是第一次超时之后,套接字关闭了?因为我只调用一次receive超时后,然后ngx.print还能输出响应到客户端,连接依然保持,有些不解
按照目前的实现,当下游 cosocket 读取超时的时候,ngx_lua 并不会自动关闭下游连接,而只是在 Lua
级别上返回错误,并将当前的 cosocket 对象置为 closed 状态。用户需要自己调用 ngx.exit(444)
来显式地关闭下游连接。
> 我这么做的初衷是保持一个长连接,通过调用receive判断客户端已断开连接然后结束
> 协程释放资源
通过 receive 判断客户端断开连接?或许你可以看一下 lua_check_client_abort 指令:
http://wiki.nginx.org/HttpLuaModule#lua_check_client_abort
以及 ngx.on_abort() 函数:
http://wiki.nginx.org/HttpLuaModule#ngx.on_abort
Best regards,
-agentzh