私は 100 ミリ秒未満で apache を実行しているローカルホスト Web サーバーにファイルを正常に投稿する python スクリプトを持っています。今、私は Lua でまったく同じことをしたいと思っています。同じ画像をウェブサーバーに投稿するスクリプトを思いつきましたが、完了するまでになんと 24 秒かかります。サーバー上で実行されているphpはファイルを適切に受信して保存しますが、Pythonスクリプトの場合、ファイルは$_FILES
配列に入りますが、Luaスクリプトの場合、php://input
ストリームからコンテンツをコピーする必要があります-また、wiresharkで両方のPOSTリクエストを見て、 Python スクリプトからは確認できます7667 POST
が、Lua からは確認できません。代わりに、少数の TCP SYN および ACK フレームのみです。Lua スクリプトに実際の POST (URL を含む) がないのに、まだ動作しているように見える (ただし、非常に遅い) 理由: いくつかのコードを以下に示します。
パイソン
#!/usr/bin/python
import urllib2
import time
from binascii import hexlify, unhexlify
import MultipartPostHandler
fname="test.gif"
host = "localhost"
#host = "semioslive.com"
URI="/test.php"
#URI="/api/gateway.php"
nodemac ="AABBCC"
timestamp = int(time.time())
func="post_img"
url = "http://{0}{1}?f={2}&nodemac={3}&time={4}".format(host, URI,func,nodemac,timestamp)
opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler)
data = {"data":open(fname,"rb")}
#r.get_method = lambda: 'PUT'
now = time.time()
response = opener.open(url, data, 120)
retval = response.read()
if "SUCCESS" in retval:
print "SUCCESS"
else:
print "RESPONSE sent at "+retval
print " Now "+str(time.time())
print "Request took "+str(time.time()-now)+"s to return"
ルア
#! /usr/bin/lua
http = require("socket.http")
ltn12 = require("ltn12")
local request_body = ltn12.source.file(io.open("test.gif"))
local response_body = {}
http.request{
url = "`http://localohst/test.php`",
method = "POST",
headers = {
["Content-Type"] = "multipart/form-data",
["Content-Length"] = 7333
},
-- source = ltn12.source.file(io.open("test.gif")),
source = request_body,
sink = ltn12.sink.table(response_body)
}
print(response_body[1]) --response to request
PHP
<?
if (isset($_FILES['data']))
move_uploaded_file($_FILES['data']['tmp_name'],"post(python).gif");
else
copy("php://input","post(lua).gif");
echo "SUCCESS!";
?>