4

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

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

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

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

4

5 回答 5

6

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

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

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

于 2013-12-03T16:29:34.583 回答
0

每次上传都调整一次大小是首选。即时调整图像大小可能会占用大量内存和 CPU(取决于访问次数和正在调整大小的图像的大小)。不仅如此,直接从磁盘显示图像比调整大小然后按请求显示要快得多。如果您在此处查看此答案,您会看到他对 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
于 2013-12-03T16:29:02.927 回答
0

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

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

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

于 2013-12-03T16:31:48.477 回答
0

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

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

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

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

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

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

于 2013-12-03T16:32:13.117 回答
0

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

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

于 2013-12-03T16:51:05.400 回答