丰雅8943 发表于 2016-6-10 09:06:44

解决JRuby下Net::FTP传输文件慢的问题

我曾经写过一个Ruby脚本,用于实时检测php代码是否修改,如果修改则马上通过FTP上传到服务器上,服务器在内网上,平时使用FileZilla上传和下载文件都很快,可是这个脚本上传一个2k的文件却要2s的时间,当时我没在意,因为比起手工上传,这个延时不算什么。
   最近我将JRuby升级到了1.5.5版本,升级过程很顺利,以前写的脚本都能正常运行,只是FTP上传文件的时间延持的更加厉害,一个2K的文件上传的速度竟然要4-5s(感觉,没有实际计时),这个让我不得不查问题所在了。
   这里怎么查问题就不细表,根据我的查找,问题出在ftp.rb下的sendport函数里。

def sendport(host, port)
af = (@sock.peeraddr)
if af == "AF_INET"
cmd = "PORT " + (host.split(".") + port.divmod(256)).join(",")
elsif af == "AF_INET6"
cmd = sprintf("EPRT |2|%s|%d|", host, port)
else
raise FTPProtoError, host
end
voidcmd(cmd)
end

    其中af = (@sock.peeraddr)耗费的时间很长,是整个过程中最耗时,文件上传速度慢的罪魁祸首,而查看JRuby源文件可知,这个总是返回AF_INET,因为Java不支持IPv6,于是解决的方法就很简单。只要把af = (@sock.peeraddr)直接改成af = "AF_INET"即可。

def sendport(host, port)
#af = (@sock.peeraddr)
af = "AF_INET"
if af == "AF_INET"
cmd = "PORT " + (host.split(".") + port.divmod(256)).join(",")
elsif af == "AF_INET6"
cmd = sprintf("EPRT |2|%s|%d|", host, port)
else
raise FTPProtoError, host
end
voidcmd(cmd)
end

    修改之后,FTP上传文件速度飞快,我一修改完代码,就可以直接刷新浏览器查看效果,再不需要等上一段时间上传完再刷新了,完美
页: [1]
查看完整版本: 解决JRuby下Net::FTP传输文件慢的问题