是按需调整图像大小更好,还是按上传调整图像大小好


Is it better to resize Image on demand or on upload?

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

我使用PHP和Apache作为Web服务器。据估计,该网站最初的访问量约为40万,并可能大幅增长。我的问题是:

我是否应该将图片调整为所需的各种大小,同时在上传时保持原始大小?或我应该只在需要和显示时调整图片的大小吗(使用类似于phpThumb的东西)?

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

磁盘价格低廉,按需调整大小非常昂贵。我从来不会为每一个请求按需调整大小。我认为你有两个选择:

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

更新:nginx有一个很好的模块,可以动态调整大小。我从来不会在生产中单独使用它,但如果你将它与反向代理相结合,你基本上可以获得第二个选项,而无需编写任何代码。

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

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

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

最好每次上传调整一次大小。动态调整图像大小可能占用大量内存和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

据我所知,这里的安全性没有问题。关于性能。。。这取决于你的目标:

  • 根据请求生成图像会对用户体验产生影响:当他需要它时,他需要等待调整大小,然后下载。但这是一个很好的方式来"传播"资源使用。请注意,在这种情况下,您只想做一次,并保留对生成的文件的引用,以便为以下所有请求提供服务。

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

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

"上传时调整大小"解决方案的一大优势是,如果你在某个时候资源有点短缺(例如,许多用户同时注册),你可以将调整大小的操作"延迟"(=排队)到一天中更安静的时间。。。

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

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

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