GD 库是不是使用大量内存?

Posted

技术标签:

【中文标题】GD 库是不是使用大量内存?【英文标题】:Does the GD library use a lot of memory?GD 库是否使用大量内存? 【发布时间】:2010-01-13 21:03:17 【问题描述】:

我想在我的 php 脚本中使用 GD 库从外部服务器生成随机大图片的小缩略图。每次调用页面时,GD库都会重新生成一个缩略图并显示出来。

这会减慢服务器速度或消耗大量内存吗?

【问题讨论】:

重新生成缩略图需要服务器时间。知道它是否“太慢”的唯一方法是尝试一下。此外,“内存”和“速度”是两个完全不同的概念。 【参考方案1】:

GD 使用大量内存。它将图像完全加载到内存中并解压缩,因此每个像素至少需要 32 位。然后使用 800 x 600 大小的图像:

800 * 600 * 32 位 = 15.4 兆位 = 2 MB

这只是为了加载图像。我听说如果你调整大小它会使用这个的两倍,如果你的图像更大,它会更多的内存。

你真的应该考虑缓存你的缩略图,这样它们只需要生成一次(这也会为你的访问者加快页面速度!)。

我现在还了解到,您正在从外部服务器加载图像,在这种情况下,您确实必须缓存图像,否则您的访问者必须等待您先下载整个图像。如果外部服务器停机或过载,并且您的访问者将不得不等待超时,情况会变得更糟(这看起来像是您的服务很慢)。除此之外,如果每次用户请求缩略图时都下载图像,则会浪费大量带宽。


由于 GD 使用如此多的内存,使用 IMagick 扩展生成缩略图可能是值得的。 ImageMagick 在内存消耗方面确实可以更好地扩展,而且速度也非常快(但由于上述原因,您仍然应该缓存图像)。

【讨论】:

+1 for “ImageMagick 在内存消耗方面确实可以更好地扩展”,这是您应该以粗体显示的关键信息!您可以删除其余部分。 :-) 缓存比选择调整大小的工具更重要。 Imagemagick 有优点(不计入 PHP 的内存限制,因为它正在调用外部进程)和缺点(需要安装许多库,可能还会引入更多的安全风险,因为它是一个大包,具有比调整大小更多的功能。)但是相对于缓存与动态生成的选择,包的选择对性能和服务器负载的影响可以忽略不计。高清空间很便宜,缩略图很小:总是缓存。【参考方案2】:

确定它会减慢服务器速度,这还取决于您使用的图像的大小。为什么不直接保存缩略图?

【讨论】:

【参考方案3】:

取决于你在做什么,但为什么不自己尝试:

memory_get_usage() — 返回分配给 PHP 的内存量 memory_get_peak_usage() — 返回 PHP 分配的内存峰值

【讨论】:

【参考方案4】:

任何类型的图像处理都可能是内存密集型的。

如果您可以缓存这些图像,以免在每次点击页面时重新生成它们,那将是一个很好的举措。

为您处理大量此类缓存的 PHP 库是 phpThumb - 它可能是此类任务的理想选择。

http://phpthumb.sourceforge.net/

【讨论】:

【参考方案5】:

如果您在每次页面加载时生成一个新缩略图,则需要额外的处理时间。根据您要缩略图的图像数量以及它们的原始尺寸,您可能会或可能不会注意到速度缓慢。如果无论如何你可以在第一个页面加载时创建缩略图并保存它,并为其他页面加载加载预先创建的版本,你会更好。

【讨论】:

您可能不会注意到测试的缓慢,但动态选项会使解决方案令人不安地不可扩展。如果流量增加适度,这种事情很容易导致服务器宕机,内存会很快用完,服务器会转向交换,导致大多数用户认为它会因为请求减慢到蜗牛的速度而下降。跨度> 【参考方案6】:

是的,这是一个糟糕的主意,随着流量的增加,它会很快导致您的服务器崩溃。

图像处理使用大量服务器资源,包括 CPU 和内存。例如,当我最近测试一个 ~600kB 的 JPG 文件时,它在峰值使用时占用了 GD ~9MB 的内存。您可以使用memory_get_peak_usage(true) 对此进行测量。如果您动态生成缩略图,则每次请求页面时都会使用这些资源。此外,由于调整大小是一项缓慢的操作,比提供文件慢得多,因此该内存将使用相当长的时间,比通常执行 PHP 脚本所需的时间要长得多。因此,一次足够数量的请求将很快导致您的服务器内存不足并进入交换状态,这是您永远不希望发生的事情,这通常会导致大多数查看您网站的人看到停机时间。

缩略图很小。例如,我从这个文件中生成了一个(仍然很大,640x480)拇指,它只占用了 64kB。较小的缩略图甚至更小。高清空间很便宜,您只存储小输出文件,而不是峰值使用量。如果原始文件在您的服务器上,存储多个缩略图所需的空间将可以忽略不计。

生成一次并存储它是这里唯一明智的选择。使用这种方法,您只需要一次产生较高的 CPU 和内存使用率,并获得提供小缩略图文件的全部好处。此外,如果您很聪明,您可以选择何时产生大量的图像处理成本,例如将未处理的图像放入队列中,然后在服务器负载相对较轻时等待片刻,然后生成缩略图。有时仅几秒钟的延迟仍会带来良好的用户体验,但如果服务器此时遇到流量高峰,则可以避免“繁重”的调用。

【讨论】:

以上是关于GD 库是不是使用大量内存?的主要内容,如果未能解决你的问题,请参考以下文章

Windows环境下php开启GD库的方法

Web前端技巧分享:教你用GD库生成验证码

PHP系列GD库

PHP图片处理(GD库)

PHP之GD库扩展

PHP之GD库扩展