按需调整图像大小还是在上传时调整更好?

4
我正在开发一个项目,需要在网站的不同部分使用各种大小的用户图片。要提供的图像是各种尺寸的主图像的缩略图,例如35 x 35像素、50 x 50像素和100 x 100像素。我想让用户只上传一张图片。
我正在使用PHP和Apache作为Web服务器。该网站最初预计会有大约400k个访问量,并且可能会显著增加。
我的问题是:
1. 在上传时,我应该将图片调整为所有所需的各种尺寸,同时保留原始尺寸吗? 2. 还是只在需要时调整图片并显示(使用类似于phpThumb的东西)?
请告诉我哪种方式在性能、速度和资源管理方面更好,考虑到流量水平和可能同时有100个并发用户访问网站。

请查看我的仓库,我刚刚完成了它。您可以在网站的不同时间点通知用户上传的大小。 - samayo
我认为这取决于图像将如何提供给用户。 - Purus
5个回答

6
硬盘很便宜,按需调整大小非常昂贵。我不会在每个请求中都按需调整大小。我认为你有两个选择:
  • 一次性在上传时生成所有不同大小的文件。
  • 存储原始文件,第一次请求特定大小时即时调整大小,并将其缓存以供未来请求使用。

更新:nginx有一个用于实时调整大小的好模块。我不会单独在生产环境中使用它,但如果与反向代理配对使用,您就可以获得第二种选项而无需编写任何代码。


1
谢谢Alex,我会选择第一个选项。感谢你的解释。 - andychukse

0

每次上传只调整大小一次是首选。动态调整图像大小可能会占用大量内存和CPU资源(取决于访问次数和要调整大小的图像大小)。不仅如此,直接从磁盘显示图像比按请求调整大小然后显示要快得多。如果您查看这里的答案, 您将看到他对一个130万像素的图像进行了测试,结果明显为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

你可以想象一种“混合”版本:每个图像都通过处理程序访问,处理程序在第一次请求时创建调整大小的图像,然后提供服务,在随后的请求中,处理程序可以直接提供服务。它还具有将图像托管到Web根目录之外并在需要时安全访问的优点。 - Laurent S.

0

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

按比例缩放上传的优点是(a)使用更少的磁盘空间; (b)您无需担心稍后调整大小/缓存图像。

但是,在许多情况下(您想要使用的默认大小发生更改,您想要使用多个不同的大小等等),您将希望保留原始较大版本并“按需”调整大小。 但是,调整大小非常耗费内存/CPU,因此如果您选择这条路线,几乎肯定要构建一个缓存系统,该系统将重新调整大小的图像版本存储在缓存文件中,并且仅在没有缓存版本时才处理它。


0
据我所知,安全性在这里并不成问题。关于性能...这取决于你的目标:
生成请求时的图像会对用户体验产生影响:当他需要时,他需要等待它被调整大小,然后下载。但这是一种“分散”资源使用的好方法。请注意,在这种情况下,您只需要执行一次,并保留对生成文件的引用,以便您可以为所有后续请求提供服务。
上传时生成图像将在用户上传图像时使用更多资源,但之后您就可以放心了。
因此,我不会说一个解决方案比另一个更好,而是取决于您预期的用户数量、您拥有的资源和您想要的用户体验。
“上传时调整大小”的一个重要优点是,如果某些时候您的资源有点短缺(例如,很多用户同时注册),您可以将调整大小操作“延迟”(=排队)到一天中更安静的时期...
无论哪种情况,我都肯定会保留原始版本,以便在更改站点时可以批量调整大小...

谢谢Bartdude,我很感激你花时间解释这些。非常感谢。但是我有一个关于排队调整大小操作的问题。这是否意味着用户在此时无法看到任何已上传的图片,因为它们被排队了? - andychukse
确实如此。但那肯定是最糟糕的情况,只有在您预计到达峰值时才使用(例如:您将在网站发布日期周围进行大量广告宣传...您可以预期会达到峰值)。当然,如果您负担不起为此预期高峰期提供扩展资源,那么这就是最差的情况。处理所有“实时”当然是您的最佳选择,但您并不总是能够做自己想做的事情... - Laurent S.

0

除非对于给定的原始图像你有大量的图像尺寸,否则最好只创建各种需要的大小一次,并在需要时提供它们。这不会占用太多服务器存储空间,而且可以节省大量的服务器CPU和用户等待时间。

如果你担心某个特定大小的图像可能只会很少被请求,那么把你的服务器图像库视为缓存。只有在需要时才生成调整大小的图像文件,并将其保存在你的库中以供下次请求时使用。如果你的主机非常受限制并且必须关注磁盘使用情况,那么在一段时间没有请求后清除调整大小的图像文件,仅保留最常请求的文件也是可行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接