1

我使用 Ruby Open Graph Protocol Gem 来抓取与 YouTube、Vimeo、Metacafe 和 Dailymotion 视频相关的图像以及它们的标题和描述。这些图像显示时带有播放按钮,当用户单击图像时,它使用 ajax 加载和播放图像的相关视频。

无论如何,我注意到我的页面在刷新后需要超过 15 秒才能加载。当我删除所有附有视频(图像)的微博时,页面加载时间恢复正常。

当用户发布微博时,他们可以链接到他们想要包含在微博中的视频,并且该链接/url 的 url 存储在我的数据库中设置的 microposts 表的链接列中。

在我看来,我将当前正在循环的微帖子的链接传递到我的辅助方法中,以获取视频的开放图形协议对象。然后从返回的对象中获取图像属性并使用 image_tag 助手来显示相关图像。

image_tag get_video_data(micropost.link).image

这就是我与开放图形协议 gem 进行通信的方式.. 助手:

def get_video_data(url)
  OpenGraph.fetch(url)
end

无论如何,这一切都会大大减慢我的页面加载时间。我想知道是否有办法解决这个问题?我认为这个问题是由于必须从不同的 URL 加载这些单独的图像引起的。我这样说是因为当我删除相关的微博并重新加载我的页面时,它的加载时间又恢复了正常。位于我的应用程序中的图像不会导致任何问题。

当用户发布微博时,他们基本上将他们希望添加到帖子中的视频链接粘贴到其中,然后将视频的图像显示回给他们,他们点击发布并发布微博。

我想知道是否应该将该图像上传到我的应用程序,这样我就可以显示以下视频的图像:

image_tag micropost.video_image

这样,页面将快速加载,因为它不需要从外部 URL 中提取图像。

我不太确定大型网站是如何做到这一点的,例如 fb、google+,但我想知道如何以及在可能的情况下获得解决方案,谢谢。

亲切的问候。

4

2 回答 2

2

这是因为 OpenGraph.fetch(url) 会发起一个 http 请求来获取必要的数据来查找图像标签。由于这必须在您的操作呈现期间发生,因此在它们全部完成之前,您不能向客户端发送任何信息。

虽然有很多方法可以解决这个问题,但我建议创建一个新操作,给定一个 opengraph 标识符将返回 opengraph 数据(基本上将辅助方法放入控制器中)并且仅将标识符输出到主操作的视图 html 中。然后,在 javascript 中,找到所有这些并执行 AJAX 请求以获取 OpenGraph 数据并在获得响应后更新页面的 HTML。这将允许浏览器并行执行 http 请求,同时也不会阻塞页面的呈现。对于奖励积分,您可以将 OpenGraph 响应缓存在 memcache 或具有合理到期时间的东西中,并节省每次都必须从您的应用程序发出 HTTP 请求的延迟。

于 2012-05-31T16:46:37.327 回答
0

假设

  • video_image 带有 db 列的回形针
  • 用于后台处理的延迟作业

基本代码可能如下所示:

class Micropost
   # 
   has_attached_file :video_image, :default_url => "/path/to/progress_image"

   after_save :fetch_external_video 

 protected

   def fetch_video_image 
     img = OpenGraph.fetch(url)
     reload.video_image = img
     save!
   end
   # put in background 
   handle_asyncronously :fetch_video_image

end

那么你可以在你的视图中使用

image_tag micropost.video_image.url

这将在仍在获取视频时显示默认 img。即使 url 没有改变,这个简单的解决方案也会在每次保存时重新获取图像。

如果您的用户可能会重复使用相同的链接,那么您最好

  • 将视频图像提取到新类
  • 有 micropost :has_one video_image,可能多态为 video_linkable
  • 将 fetch_video_image 作为 after_create 回调
  • 你使用 micropost.video_image.find_or_create_by_url(url)

有了这个,您可以制作多个指向各种对象的视频链接,而无需重复和仅获取一次。

于 2012-05-31T17:27:12.180 回答