2009-06-26 47 views
4

这是事情。现在我有这个电子商务网站,人们可以为他们的产品发送大量图片。所有的图像都存储在亚马逊的S3。当我们需要缩略图或其他东西时,如果有S3可用,我会检查S3。如果不是,我处理一个并发送给S3并在浏览器上显示。每个不同大小的缩略图都存储在S3中,并且在每个请求中检查缩略图的可用性都是很费钱的。恐怕一旦网站开始获得更多关注(如果......),我会付出很多。图像缓存与PHP和S3中的图像处理

思考替代品时,我考虑只保留S3的原始图像,并在每次请求时处理图像。我想象那样,我会依靠CPU使用率,但是我没有做出任何基准来看看我能走多远。问题是,我不会花费钱在S3上存储更多图像,并且我可以将所有内容都缓存在用户的浏览器上。我知道这样做并不安全,所以我在这里提出这个问题。

您认为如何?你觉得我可以解决这个问题吗?

+0

即时处理它可能无法正常工作,因为到目前为止,我尝试过的大多数PHP图像处理函数都非常耗时。在客户端调整大小(或仅显示缩放)可能会起作用,但您必须每次都传输完整的有效内容。有没有什么办法可以将调整大小的图像缓存在服务器上? – Daff 2009-06-26 22:11:37

+0

我正在一个非常小的磁盘大小的slice @ slicehost上运行我的页面...只有20GB,这不是太小,但我想用它填充图像并不是一个好主意。他们会在很短的时间内占用大量的空间,我猜... – 2009-06-26 22:42:33

回答

2

保持的本地缓存:

  1. 哪些图像是在S3
  2. 最热门的图片

然后在这两种情况下,你有一个本地参考的缓存。如果图像不在本地缓存中,则可以检查本地缓存以查看它是否在S3中。保存最流行项目的S3流量,并在检查不在本地缓存中的项目的S3时节省延迟。

+0

不幸的是,保留每个图像的本地参考不是我的选择...也许缓存最常用会有所帮助,但我将不得不限制为... – 2009-06-28 13:59:21

+0

所以,我已经限制图像缓存为1Gb ...到目前为止已经够了! tks :) – 2009-08-20 21:32:34

5

我会在上传时调整大小,并将所有版本存储在S3中。例如,如果您有较大的图像(1200x1200〜200kb)并创建3个尺寸调整的版本(300x300,120x120和60x60),则只需添加约16%或32kb(对于我的测试图像YMMV)。假设你需要存储一百万张图片;那大概多出30 GB,或者每个月增加4.5美元。据Flickr报道,拥有20亿张图片(2007年),每月额外增加约9万美元,如果你是那么大的话,不会太差。

另一个主要优势是您将能够使用亚马逊的CloudFront。

3

如果你从S3代理到客户端(这听起来像你正在做的),考虑两个优化:

  1. 在上传时,一次调整的图像,并上传作为一个包( tar,XML等等)
  2. 将这些图像包缓存在您的前端节点上。

'图像包'将减少PUT/GET/DELETE操作的数量,这在S3中不是免费的。如果你有4个图像大小,你会减少4.

缓存将进一步减少S3流量,因为我认为工作流程通常会看到一个缩略图 - >点击它的大图像。

最重要的是,您可以实现一个主动推送到您的网络节点的“热图像”缓存,以便在您使用群集时预缓存。

此外,我不建议使用Slicehost < - > S3。运输成本将会杀死你。你应该真的使用EC2来节省大量的带宽(Money !!)。

如果您不是代理服务器,但是将图片的客户S3 URL传递给您,您一定要对所有图片进行预处理。然后,您不必检查它们,只需将URL传递给您的客户端即可。

每次重新处理图像都是昂贵的。你会发现,如果你可以假设所有的图像都被调整大小,你的网络节点上的工作量就会下降,一切都会加快。由于您没有发出多个S3请求,因此尤其如此。