的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