的LuaSocket HTTP模块文件说,超时可以在HTTP连接上设置:LUA HTTP套接字超时
以下常量可以设置来控制HTTP模块的默认行为:
PORT :用于连接的默认端口; PROXY:用于连接的默认代理; TIMEOUT:设置所有I/O操作的超时时间; USERAGENT:默认的用户代理报告给服务器。 http://w3.impa.br/~diego/software/luasocket/http.htm
如何在lua脚本中设置这些常量?
的LuaSocket HTTP模块文件说,超时可以在HTTP连接上设置:LUA HTTP套接字超时
以下常量可以设置来控制HTTP模块的默认行为:
PORT :用于连接的默认端口; PROXY:用于连接的默认代理; TIMEOUT:设置所有I/O操作的超时时间; USERAGENT:默认的用户代理报告给服务器。 http://w3.impa.br/~diego/software/luasocket/http.htm
如何在lua脚本中设置这些常量?
为此,您可以设置为一个请求,而不是整个HTTP模块超时:
local socket = require "socket"
local http = require "socket.http"
response = http.request{url=URL, create=function()
local req_sock = socket.tcp()
req_sock:settimeout(5)
return req_sock
end}
注意的:settimeout
默认行为,以及像http.TIMEOUT
全局设置,设置一个时间限制对于请求中的任何单独操作 - 换句话说,操作可能会持续多长时间没有任何活动超时。如果您希望在操作上设置总体上限 - 整个请求不能超过的时间,,而不管活动 - 您应该将't'
的模式参数作为第二个参数传递给:settimeout
,如下所示:
local socket = require "socket"
local http = require "socket.http"
response = http.request{url=URL, create=function()
local req_sock = socket.tcp()
-- note the second parameter here
req_sock:settimeout(5, 't')
return req_sock
end}
作为一个例子来说明这两种模式之间的区别,想象一下,让你的请求后,服务器响应的块每秒一次的回应,采取7秒全面完成。与req_sock:settimeout(5, 'b')
(或只是req_sock:settimeout(5)
)设置一个5秒钟的块超时,则该请求将进行得很好,因为没有基础I/O操作花费的时间超过5秒:然而,与req_sock:settimeout(5, 't')
设置一个五秒钟总计超时,请求将在5秒后失败。
当然,它可能是有意义的设置这些持续时间这两个限制,既具有短期活动超时以及更长的整体超时。因此,per the documentation,可以让两个单独的呼叫指定都:
local socket = require "socket"
local http = require "socket.http"
response = http.request{url=URL, create=function()
local req_sock = socket.tcp()
req_sock:settimeout(5, 'b')
req_sock:settimeout(30, 't')
return req_sock
end}
我不知道我明白这一点。有了我发现的解决方案(现在下面发布),我是否真的改变了所有新HTTP套接字的超时时间?如果是这种情况,我可以在连接成功后将其值重置为默认的60秒。你能解释一下你的代码片段,特别是'create = function()'部分吗? – ripat 2011-05-16 18:52:17
我刚做了一些测试,实际上,当我使用'mysocket.TIMEOUT'更改超时时,它会为所有后来创建的新HTTP套接字保留该值,除非您再次更改它。有了你的建议,你不用创建两个套接字吗?一个http和一个tcp? – ripat 2011-05-16 19:22:13
@ripat请求的'create'参数指定了*创建*它用来执行* HTTP请求([HTTP应用层通过TCP传输层](http:// en。 wikipedia.org/wiki/TCP/IP_model))。如果你没有指定一个创建函数,默认情况下,http.request将对'tcp()'使用一个普通的调用(参见[manual](http://w3.impa.br/~diego/software/luasocket/) http.html))。 – 2011-05-16 20:11:44
这比我想象中的简单。只需
local mysocket = require("socket.http")
mysocket.TIMEOUT = 5
将您的解决方案作为答案并接受它,因此此问题将完成。 – 2011-05-16 12:03:36
我试过了,但我必须在第一篇文章发布之后的8小时后才能回答我自己的问题。我今晚会做(CET)。 – ripat 2011-05-16 12:19:27
现在您的限制应该已经超过10个重点。 – BMitch 2011-05-16 13:26:15