Rails send_data()过程延迟

时间:2014-11-12 15:47:17

标签: ruby-on-rails-4 nginx passenger

我的控制器中有以下代码生成一个kml文件:

def generate_kml

 links = Link.all.where('status = 1')

 links_hash = {}
 links.each do |link|
  if links_hash["#{link.siteid1}-#{link.siteid2}".to_sym]
    links_hash["#{link.siteid1}-#{link.siteid2}".to_sym][:count] += 1
    links_hash["#{link.siteid1}-#{link.siteid2}".to_sym][:links] << link
  else
    links_hash["#{link.siteid1}-#{link.siteid2}".to_sym] = {}
    links_hash["#{link.siteid1}-#{link.siteid2}".to_sym][:count] = 1
    links_hash["#{link.siteid1}-#{link.siteid2}".to_sym][:links] = [link]
  end
 end
 links.clear


 sites = {}
 links_hash.each_value do |linklist|

   siteid1 = linklist[:links].first.siteid1
   siteid2 = linklist[:links].first.siteid2
   longitude1 = linklist[:links].first.longitude1
   latitude1 = linklist[:links].first.latitude1
   longitude2 = linklist[:links].first.longitude2
   latitude2 = linklist[:links].first.latitude2


    kml_string << "\n\n<Folder>"
      kml_string << "\n<name> #{siteid1} - #{siteid2}</name>"

      if sites[siteid1] != true
        sites[siteid1] = true
        #place the first point
        kml_string << "\n<Placemark>\n<styleUrl>#site_icon</styleUrl>"
          kml_string << "\n  <name> #{siteid1}</name>"
          #kml_string << "\n  <description>#{site_properties link, 1}</description>"
          kml_string << "\n  <visibility>1</visibility>"
          kml_string << "\n  <Point>"
            kml_string << "\n    <coordinates>#{longitude1},#{latitude1}</coordinates>"
          kml_string << "\n  </Point>"
        kml_string << "\n</Placemark>"
      end
      if sites[siteid2] != true
        sites[siteid2] = true
        #place the second point
        kml_string << "\n<Placemark>\n<styleUrl>#site_icon</styleUrl>"
          kml_string << "\n  <name> #{siteid2}</name>"
          #kml_string << "\n  <description>#{site_properties link, 2}</description>"
          kml_string << "\n  <visibility>1</visibility>"
          kml_string << "\n  <Point>"
            kml_string << "\n    <coordinates>#{longitude2},#{latitude2}</coordinates>"
          kml_string << "\n  </Point>"
        kml_string << "\n</Placemark>"
      end



      points = generate_points(latitude1, longitude1, latitude2, longitude2, linklist[:links].size)

      line_count=0
      linklist[:links].each do |link|
         #draw a line
         kml_string << "\n<Placemark>"
            kml_string << "\n  <name> #{siteid1} - #{siteid2}</name>"
              kml_string << "\n  <description>#{link_properties link}</description>"
              kml_string << "<styleUrl> #working_link_line#{line_count+1}</styleUrl>"
              kml_string << "\n  <LineString>"
                 kml_string << "\n    <altitudeMode>clampToGround</altitudeMode>"
                    kml_string << "\n    <coordinates>#{points[line_count][0]},#{points[line_count][1]} #{points[line_count+1][0]},#{points[line_count+1][1]},0</coordinates>"
              kml_string << "\n  </LineString>"
         kml_string << "\n</Placemark>"

         line_count += 1
      end


     kml_string << "\n</Folder>"  
  end  


  links_hash.clear


  send_data kml_string, 
        :type => 'charset=utf-8; text/xml', 
        :disposition => "attachment; filename=kmlfile.kml"
end

文件大小为2.87 MB。

问题:当我通过单击控制器中此操作的链接来调用 generate_kml 过程时,没有任何反应。我看不到状态栏中的任何进展,或任何已启动文件下载的指示。 10秒后,立即下载文件。当我在Mac上本地运行我的应用程序时会发生这种情况。

但是,当我在我们(强大的)本地服务器(在使用Ubuntu Server + Nginx + Phusion Passenger的局域网上)上部署此应用程序时,延迟需要更长的时间(大约60秒)才能达到相同的kml(相同尺寸)立即下载。

有没有人知道发生了什么以及可能的解决方法?

1 个答案:

答案 0 :(得分:0)

没关系,我解决了这个问题。只是想分享以防有人遇到类似的问题。

瓶颈是我们的代理人。我刚刚将Rails应用程序服务器的IP地址(我的应用程序所在的位置)添加到我的浏览器的异常列表(bypass-proxy list),它就像一个魅力,生成并下载文件需要5秒钟。