【问题标题】:lua http socket timeoutlua http套接字超时
【发布时间】:2017-03-22 09:52:50
【问题描述】:

LuaSocket HTTP 模块文档说可以在 HTTP 连接上设置超时:

可以设置以下常量来控制 HTTP 模块的默认行为:

PORT:用于连接的默认端口; PROXY:用于连接的默认代理; TIMEOUT:设置所有I/O操作的超时时间; USERAGENT:默认用户代理报告给服务器。 http://w3.impa.br/~diego/software/luasocket/http.htm

如何在 lua 脚本中设置这些常量?

【问题讨论】:

  • 将您的解决方案添加为答案并接受它,这样这个问题就完成了。
  • 我试过了,但我必须在第一次发帖后等待 8 小时才能回答我自己的问题。我今晚会做(CET)。
  • 既然你有超过 10 个代表点,这个限制应该已经消失了。
  • 不。我仍然有同样的通知:新用户在 8 小时内无法回答自己的问题。请改用 cmets,或编辑您的问题。

标签: sockets lua luasocket


【解决方案1】:

这比我想象的要容易。简单的

local mysocket = require("socket.http")
mysocket.TIMEOUT = 5

【讨论】:

  • 这是否有“副作用”,在需要的文件之外更改 http 套接字配置? (即在同一个程序上的代码,但在另一个文件上,它自己需要 http.socket)
  • @josinalvo:是的,程序中的所有文件都共享package.loaded 下的公共模块的相同实例。请参阅my answer 了解没有副作用的方法。
【解决方案2】:

您可以这样做来为一个请求而不是整个 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 这样的全局设置会为请求中的任何单个操作设置时间限制 - 换句话说,它是多长时间操作可能会在超时之前在没有任何活动的情况下进行。如果您希望在操作上设置 总体上限 - 总体请求不能超过的时间,无论活动如何 - 您应该传递一个模式参数 @ 987654327@ 作为: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 秒 block 超时的情况下,此请求将正常进行,因为没有 基础 I/O 操作超过 5 秒:但是,req_sock:settimeout(5, 't') 设置了 5 秒 total 超时,请求将在 5 秒后失败

当然,为这些持续时间两个设置限制可能是有意义的,同时具有较短的不活动超时以及较长的总体 em> 超时。因此,per the documentation,您可以进行两个单独的调用来指定 both

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 秒将其值重置为默认值。你能解释一下你的 sn-p,尤其是create = function() 部分吗?
  • 我刚刚做了一些测试,事实上,当我使用mysocket.TIMEOUT 更改超时时,它会为之后创建的所有新 HTTP 套接字保留该值,除非您再次更改它。根据您的建议,您不创建两个套接字吗?一个 http 一个 tcp?
  • @ripat 请求的create 参数指定创建它用来执行 HTTP 请求(@987654322 @)。如果你不指定创建函数,http.request 将默认使用对tcp() 的普通调用(参见the manual)。
  • 哦,我明白了。尽管在脚本执行期间为整个模块设置默认值通常不是问题,但您的解决方案可以更好地控制 HTTP 套接字。谢谢斯图尔特。
  • 第 2 行 require "socket.tcp" 和第 4 行 local socket = tcp() 无效。第 2 行应删除,第 4 行应为local socket = socket.tcp()
猜你喜欢
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2014-06-27
  • 2012-03-08
  • 2011-05-11
  • 1970-01-01
  • 2013-05-23
相关资源
最近更新 更多