解决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)[0]
      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)[0]耗费的时间很长,是整个过程中最耗时,文件上传速度慢的罪魁祸首,而查看JRuby源文件可知,这个总是返回AF_INET,因为Java不支持IPv6,于是解决的方法就很简单。只要把af = (@sock.peeraddr)[0]直接改成af = "AF_INET"即可。
  def sendport(host, port)
      #af = (@sock.peeraddr)[0]
      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上传文件速度飞快,我一修改完代码,就可以直接刷新浏览器查看效果,再不需要等上一段时间上传完再刷新了,完美

你可能感兴趣的:(.net,PHP,脚本,Ruby,jruby)