2010-05-12 137 views
24

我正在建立一个图像共享网站,并希望知道利用PHP动态调整图像大小和利弊,并有存储调整大小的图像。PHP图像调整大小与存储调整大小的图像

哪个更快?

哪一个更可靠?

这两种方法在速度和性能上的差距有多大?

请注意,无论是哪种方式,图像通过一个PHP脚本的统计数据,如视图或如果盗链是允许等...所以不像它将成为图像的直接链接,如果我选择存储调整大小的图像。

我会感谢您的意见或任何有关该主题的链接。

+0

很好的问题,我们可以认为存储图像缩略图是不好的,因为它会创建重复的图像,当您备份您的网站时也没有用的数据。 – baptx 2015-09-07 14:20:18

回答

16

这听起来像是不成熟的优化。你知道你的网站会有多少用户?你的服务器会有多少计算量?使用最简单的(维护方式)选项,即即时调整大小,直到性能成为问题,然后从中找出要执行的操作。

如果重新调整图像的服务器端缓存实施某种服务器端缓存(如果它们可能被重复打击),但我不认为这需要延长到显式预渲染的程度。

+0

感谢您的建议。我目前正在缓存所有的缩略图,因为在一个页面中会有许多缩略图,并且保留了图片页面和下载选项的动态调整大小。 – Pablo 2010-05-13 00:18:40

+0

您可以轻松构建您自己的Resizer应用程序,查看此回购:https://github.com/sadok-f/flyimg – 2017-01-03 23:09:33

22

根据图像的初始大小,动态调整大小可能是一个代价高昂的过程(按时间)。我已经在生产系统中完成了它,但是当我有选择的时候,我非常喜欢缓存到磁盘。毕竟,磁盘空间很便宜,并且加载时间就是Web上的所有内容。即使您只是以特定大小缓存缩略图并在其他地方动态调整大小,您也可以大大减少图库式图像列表的加载时间。

+0

您是对的,我的现场主机上有400GB可用。我想我会存储所有调整大小的图像。感谢分享。 – Pablo 2010-05-13 00:37:48

15

我强烈建议你缓存你的图像,而不是动态调整大小。

调整图像大小非常耗费CPU和内存消耗为您的服务器。

如果您有一个图片库可以实时缩放,页面会缓慢加载图片,例如3-10秒,取决于原始文件大小。

调整大小时,需要占用大约3个字节的内存像素。所以,如果你有一个1000x1000的图像被调整大小,它将需要大约3MB的内存。如果您的一个网页上有许多这些动态调整大小的图片,比如说20,那么您的服务器大约需要60MB的内存。 也许不是,因为大多数客户端当时只需要4张图片,但12MB对于页面加载仍然很重要。如果源图像小于100x100像素,我只能进行缩放。

提示:缩放和保存大拇指一个伟大的lib是PhpThumb

+0

感谢您的输入,即时将图像存储在文件系统中。 – Pablo 2010-05-13 00:46:47

28

这绝对是无与伦比的事项。

动态调整图像大小,实际上就像在自己的服务器上运行DoS攻击一样。调整一个常规图像的大小需要比为php脚本提供一个常见请求更多的CPU和RAM。这对性能产生了巨大的影响。然而,通常的缩略图并不是孤立的,而是数字。因此,虽然只显示一个图库页面,但您正在创建数十个重负载进程,从而将服务器负载增加了十倍或更多。

快速和肮脏的测试,以证明我的话: 让我们尝试调整相对较小,1,3万像素的图像

$ /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 

我们花了0,1s,因此,表现出10个图像预览会吃一个整整一秒的CPU时间。虽然正确书写的PHP画廊页面大约需要0.01秒。因此,随着您的调整大小,您将服务器负载增加了100倍。

与内存相同。每个调整大小的过程将会消耗不少于10M的内存(调整一个100k图像文件的大小!),总共为100M。尽管PHP脚本通常的内存限制仅为8M,并且很少达到。

这就是现实生活中的数字。

与此问题相关

一个有些有趣的事:
完全一样的PHP用户谁扔容易的CPU周期之外1000000s同时是令人难以置信的嫉妒不遗余力1或2!这不是一个数字,这里是我正在谈论的一个例子:
A similar question从某人,其高度关注在同一时间作为可忽略的东西speed difference between Constants, Variables or Variable Arrays。谁最近run into allowed memory size exhausted problem,好像这样的灾难是不够的。

这个网站上有大量的问题和答案,讨论任何操作的纳秒速度差异,以无尽的尊严回答,运行数百万次迭代的测试,以显示几个CPU周期的一次性操作之间的完全可以忽略的差异。

同时也有类似的问题 - 关于两种方法之间在性能方面的巨大的,无与伦比的差异,这与两位作者看似平等。

这是一般PHP用户和本网站的问题。
前者根本没有办法从微观角度讲真实的东西。
然而后者没有对问题进行完整性检查的机制 - 即使两个问题彼此矛盾(并且都有常识),每个人都以同样的热情回答。

+0

OP的问题本身只是问哪种方式更好,当然,事先调整图像大小并存储它们的大小是一个巨大的性能提升和无与伦比的事情。不包括在使用实时方法时,调整同一图像两次(至少)的大小是您可以获得的最差性能。但是,如果运行中的图像调整大小服务与前面的某个CDN一起使用,那么每个图像都会缓存起来,这可能是一个非常好的选择。实际上,我可能会说这是将调整大小的图像存储到磁盘的懒惰版本。 – eAbi 2015-06-21 20:51:31