【问题标题】:Is it better to resize Image on demand or on upload? [closed]按需调整图片大小还是上传图片更好? [关闭]
【发布时间】:2013-12-19 19:37:19
【问题描述】:

我正在开展一个项目,该项目需要在网站的不同部分使用不同尺寸的用户图片。要提供的图像是各种尺寸的主要图像的缩略图,例如 35 x 35 像素、50 x 50 像素和 100 x 100 像素。我想允许用户只上传一张图片。

我使用 PHP 和 Apache 作为网络服务器。据估计,该网站最初的访问量约为 40 万,并且可能会显着增加。 我的问题是:

我是否应该将图片调整为所需的各种尺寸,同时在上传时保留原图? 要么 我应该只根据需要调整图片大小并显示(使用类似于 phpThumb 的东西)吗?

考虑到流量水平以及在给定时间站点上可能有多达 100 个并发用户,我想知道哪个性能更好,速度方面和资源管理方面更好。

【问题讨论】:

  • 看看我的repo我刚刚完成。您可以在网站的不同秒内通知用户要上传的大小
  • 我会说这取决于图像将如何提供给用户。

标签: php thumbnails image-resizing imagick phpthumb


【解决方案1】:

磁盘很便宜,按需调整大小非常昂贵。我永远不会根据每个请求的需求调整大小。我认为你有两个选择:

  • 在上传时生成所有不同的尺寸。
  • 存储原始文件,在第一次请求特定大小时即时调整大小,并将其缓存以供将来的请求使用。

更新:nginx 有一个nice module for resizing on the fly。我永远不会在生产中单独使用它,但如果你将它与反向代理结合使用,你基本上可以得到第二种选择,而无需编写任何代码。

【讨论】:

  • 谢谢 Alex 我会选择第一个选项。感谢您的解释。
【解决方案2】:

这完全取决于您的应用程序和要求。

在上传时进行缩放的优势在于 (a) 您使用的磁盘空间更少; (b) 您不必担心以后调整图像大小/缓存图像。

但是,在很多情况下(您想要使用的默认尺寸发生变化,您想要拥有多个不同的尺寸等),您需要保留原始的较大版本并“按需”调整大小。但是调整大小是非常占用内存/CPU 的,所以如果你走这条路,你几乎肯定应该构建一个缓存系统,将调整大小的图像版本存储在缓存文件中,并且只有在没有缓存版本时才处理它。

【讨论】:

    【解决方案3】:

    最好每次上传调整一次大小。即时调整图像大小可能会占用大量内存和 CPU(取决于访问次数和正在调整大小的图像的大小)。不仅如此,直接从磁盘显示图像比调整大小然后按请求显示要快得多。如果您查看this answer here,您会看到他对 1.3 兆像素的图像进行了测试,结果是相当明显的 0.1 秒:

    $ /usr/bin/time --format="%MK mem %Es CPU time" /usr/bin/convert angry_birds_1280x800.jpg -resize 100x100 thumb.jpg
    10324K mem 0:00.10s CPU time
    

    【讨论】:

    • 你可以想象一个“混合”版本:每个图像都通过一个处理程序访问,处理程序在第一次请求时创建调整大小的图像,然后提供它,在后续请求时,处理程序可以直接服务它。它还可以提供在 webroot 之外托管图像的可能性,并在需要时对其进行安全访问。
    【解决方案4】:

    据我所知,这里不存在安全问题。关于性能...这取决于您的目标:

    • 根据请求生成图像会影响用户体验:当他需要它时,他需要等待它调整大小,然后下载。但这是“分散”资源使用的好方法。请注意,在这种情况下,您只想执行一次,并保留对生成文件的引用,以便您可以为所有后续请求提供服务。

    • 在上传时生成图像会在用户上传图像时使用更多资源,但你可以接受它

    所以我不会说一种解决方案比另一种更好,但这取决于您期望的用户数量、您拥有的资源以及您想要的用户体验。

    “在上传时调整大小”解决方案的一大优势是,如果您在某些时候资源有点短缺(例如,在很多用户同时注册的情况下),您可以只是“延迟" (=queue) 调整大小操作到一天中更安静的时段...

    不过,在这两种情况下,我肯定会保留原始版本,以便您可以批量调整其大小,以防您更改网站...

    【讨论】:

    • 感谢 Bartdude,感谢您花时间解释事情。非常感谢。但我有一个关于排队调整大小操作的问题。这是否意味着用户此时无法看到任何上传的图片,因为它在排队?
    • 确实如此。但这绝对是最糟糕的情况,仅在您预计会出现高峰时使用(例如:您正在启动网站,周围有很多广告......您可以期待在发布日期出现高峰)。当然,如果您在这个预期的高峰期负担不起扩展资源的话。把一切都“活”起来当然是你能达到的最好目标,但你不能总是做你想做的事……
    【解决方案5】:

    除非您对给定的原始图像有大量 个图像尺寸,否则最好只创建一次各种图像,然后根据需要提供它们。服务器上的存储空间并不那么,您将节省大量的服务器 CPU 和用户等待时间。

    如果您担心给定大小的给定图像可能很少被请求,请将您的服务器图像存储库视为缓存。仅在需要时生成调整大小的图像文件,并将其保存在您的存储库中以供下次请求时使用。如果您不想在将一大堆图像上传到服务器时消耗大量 CPU 周期,这也将起作用。如果您有一个非常严格的主机并且必须注意您的磁盘使用情况,您可以在一段时间无请求后清除调整大小的图像文件,只保留最常请求的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-25
      • 2014-08-26
      • 2011-05-28
      • 1970-01-01
      • 2012-01-05
      • 2016-10-11
      相关资源
      最近更新 更多