lua http socket timeout
LuaSocket HTTP模块文档说可以在HTTP连接上设置超时:
可以设置以下常量来控制HTTP模块的默认行为:
PORT:用于连接的默认端口;
PROXY:用于连接的默认代理;
超时:设置所有I / O操作的超时;
USERAGENT:向服务器报告的默认用户代理。
http://w3.impa.br/~diego/software/luasocket/http.htm
如何在lua脚本中设置这些常量?
-
添加您的解决方案作为答案并接受它,因此此问题将是完整的。
-
我尝试过,但是在发布第一篇文章之后,我必须等待8个小时才能回答自己的问题。 我今晚(CET)会这样做。
-
现在您的代表点已超过10分,该限制应该消失了。
-
不。 我仍然收到同样的通知:新用户无法在8个小时内回答自己的问题。 请使用评论,或编辑您的问题。
这比我想的要容易。只是
1 2
| local mysocket = require("socket.http")
mysocket.TIMEOUT = 5 |
-
这会产生副作用吗?在需要的文件外部更改http套接字配置吗? (即同一程序上的代码,但对http.socket本身有要求的另一个文件上的代码)
-
@josinalvo:是的,程序中的所有文件在package.loaded下共享其通用模块的相同实例。请参阅我的答案以获取无副作用的方法。
您可以执行以下操作为一个请求而不是整个HTTP模块设置超时:
1 2 3 4 5 6 7
| 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,如下所示:
1 2 3 4 5 6 7 8
| 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} |
作为说明这两种模式之间区别的示例,请想象一下,在发出请求后,服务器每秒响应一次响应块,总共花费了七秒钟。使用req_sock:settimeout(5, 'b')(或仅req_sock:settimeout(5))设置5秒钟的块超时,此请求将进行得很好,因为基本的I / O操作都不会花费超过5秒的时间:但是,使用req_sock:settimeout(5, 't')设置5 -秒的总超时,该请求将在五秒钟后失败。
当然,为这两个持续时间设置限制可能很有意义,既要有较短的不活动超时,又要有较长的总体超时。因此,根据文档,您可以进行两个单独的调用来指定两者:
1 2 3 4 5 6 7 8
| 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()部分?
-
我刚刚进行了一些测试,实际上,当我使用mysocket.TIMEOUT更改超时时,除非您再次对其进行更改,否则它将为随后创建的所有新HTTP套接字保留该值。根据您的建议,您不创建两个套接字吗?一http和一tcp?
-
@ripat请求的create参数指定用于创建用于执行HTTP请求的TCP套接字的函数(HTTP应用程序层遍历TCP传输层)。如果您未指定创建函数,则默认情况下http.request将使用对tcp()的普通调用(请参见手册)。
-
哦,我明白了。尽管在脚本持续时间内为整个模块设置默认值通常不是问题,但是您的解决方案可以更好地控制HTTP套接字。谢谢斯图尔特。
-
第2行require"socket.tcp"和第4行local socket = tcp()无效。第2行应删除,第4行应为local socket = socket.tcp()。
-
我用req_sock:settimeout(2,t)得到了更好的结果。 t是一种模式,它指定超时...好吧,idk。但是有效
-
仅供参考,堆栈溢出(以我为例)隐藏了最后两个注释(很重要)。您可以将行更改为req_sock:settimeout(5,t)来设置总超时。默认的块超时不直观,并且与问题的答案中提到的类似" http.TIMEOUT = 5"情况不同。
-
据我所知,"块"超时模式的行为与http.TIMEOUT相同-两者都控制每个I / O操作的超时时间。我已经在答案中添加了有关超时模式的解释,但是我在描述http.TIMEOUT替代方案的初始部分坚持默认设置。