2012-03-03 37 views
3

我正在研究Google Image Charts API服务的PHP包装器。它支持来自多个域的服务图像,例如:跨域传播图片下载的策略?

http://chart.googleapis.com 
http://0.chart.googleapis.com 
http://1.chart.googleapis.com 
... 

数字范围是0-9,因此共有11个域可用。

我想自动追踪生成的图像的数量并旋转域以在浏览器中获得最佳性能。然而谷歌本身只vaguely recommends

...你应该只当加载或许五个或更多的图表在页面上需要这个。

  • 应该是什么我的策略是什么?我应该只更改每个N图像的域名,并且在现代浏览器的情况下,N值会有多好?

  • 是否有点重用域而不是引入新域(有助于保存DNS查找)?

我没有考虑到图像的具体数目 - 因为这是开源的,可公开获得的代码,我想实现通用的解决方案,而不是优化我的特定需求。

回答

1

注意事项:

  • 是一个主机比其他的快?
  • 浏览器是否限制每个主机的连接?
  • 浏览器需要多长时间才能解析DNS名称?

正如你想要这样做一个组件,我建议你让它能够有多个策略来找到使用的主机名。这不仅可以让你有不同的策略,而且可以对彼此进行测试。

另外,您可能希望添加对可以在将来在页面上呈现数据的JavaScript库的支持,因此无论如何您可能都希望保持模块化。

变种:

  1. 选择一个域名,并坚持下去,硬编码:http://chart.googleapis.com
  2. 选择一个域名了许多的,坚持下来:例如http://#.chart.googleapis.com
  3. 与2一样,但在一些图像后开始旋转名称。
  4. 与3一样,但在页面末尾添加一些javascript块,以解决后台丢失主机名的DNS问题,以便为下一个请求缓存(提供目前未使用的主机名数据)。

然后你可以让你的库可配置,所以你不需要在代码中强化代码的值,但你提供的默认配置。

然后,您可以将策略添加为配置,以便实施的人员可以对其进行决策。

然后,您可以使组件提供从外部加载配置,因此,假设您创建Wordpress插件,插件可以存储配置并为插件用户提供管理界面以更改设置。

由于配置已经包含遵循哪些策略已完全放弃责任组件的消费者,你可以更容易地在不同的网站或应用程序集成的不同使用情况的场景。

+0

在考虑(1)我会想象这些主机别名和性能相等(2)我知道浏览器做的限制,但不知道什么是实际通用的限制由去(这是问题的一部分)3( )我认为这将取决于环境而大幅波动,但可以肯定的是,它需要_some_(如在非零时间)来解决先前未知的域。 – Rarst 2012-03-03 20:45:49

+0

**编辑:**(1)声音。 (2)根据每个主机名的RFC 2并发连接,浏览器通常会在当前执行更多和其他类型的连接,请参阅[并行化跨主机名下载](http://code.google.com/speed/page-speed/docs/rtt。 HTML#ParallelizeDownloads)。 (3)请参阅[最小化DNS查找](http://code.google.com/speed/page-speed/docs/rtt.html#MinimizeDNSLookups) – hakre 2012-03-03 21:30:12

+0

根据这些文章和您的答案,我使用了可配置的选项,默认为每6个图像更改一次域名,并只能通过3个域名轮换。 – Rarst 2012-03-04 12:44:56

0

我完全不明白旋转域的请求。我猜这在您的浏览器可能一次只允许X给定域名打开请求的情况下有意义,因此如果您有10张图片来自chart.googleapis.com,您可能需要等待第一个完成下载在开始接收第五个之前,依此类推。

与随机旋转域的问题是,那么你打败浏览器缓存完全。如果图像是在1.chart.googleapis.com上从一个页面加载,然后从7.chart.googleapis.com在下一页加载时提供的,则缓存的图表将失效,用户需要等待请求,生成并重新下载。

我能想到的最好的解决方法以某种方式确定从算法来请求来自所述请求的域。如果它在某个函数中,可以以某种方式将参数md5,转换为整数,然后提供{$result % 10}.chart.googleapis.com中的图像。

可能有点矫枉过正,但你至少可以保证一个给定的图像将始终从同一个服务器提供服务。

+0

准确地说 - 这个想法是绕过连接限制,并使浏览器从不同域的paralles下载。我同意随机似乎不是一个好主意。逻辑应该是持久的,以便以相同的顺序生成的相同图像每次都会得到相同的URL。校验和是随机的,并且让它变得偶然,可能会让事情变得更糟... 10个图像分布在10个域中可能没有意义 - 从DNS查找中丢失可能比从域扩展中获得更多。 – Rarst 2012-03-03 21:33:15

+0

是的。我认为任何现代浏览器的默认都不会有低于4的并发请求限制,所以也许更好的方法是保留一个静态计数器并为一个域的前4个图表提供服务,然后继续通过这些域进行访问。 – goldenapples 2012-03-03 21:41:37