2009-07-13 74 views
5

有没有办法来防止PHP GD image library内存不足?如果上传的图片太大,GD往往会耗尽内存,终止脚本。我希望它能够抛出一个可捕获的异常或其他类似的东西,但事实并非如此。防止GD图像库耗尽内存的故障安全方式? (PHP)

现在我使用的是拼凑在一起的脚本,首先发出ini_set('memory_limit', '128M'),如果工作我通常都集。尽管这可能是不可能的,但根据服务器配置的不同,所以我又回到了一种试图估算所需内存量(考虑分辨率,颜色深度,通道和模糊因素)的算法,然后将其与如果函数存在,则返回memory_get_usage(),否则进行粗略估计。

整个事情的工作,到目前为止,但它优雅的远,并会在一些边缘的情况下失败了,我敢肯定。有没有更好的方法来做到这一点,即如果GD必须要优雅地失败,而不是一切都停下来?

+1

大JPEG图像(非PNG或其他类型的)可以调整负荷的同时,看到这个答案的详细信息:http://stackoverflow.com/questions/12661/efficient-jpeg-image-resizing- in-php/4613341#4613341 – 2011-01-06 09:43:42

回答

3

购买更多记忆! :-P

虽然严重,就不可能处理被淘汰的内存,因为你采取的任何行动都需要更多的内存。

最好的办法是根据当前的内存设置限制正在上传的图像大小。

+2

大声笑,给我买一个内存更多的主机。 ;-)那么,我至少会喜欢GD来估计它自己的内存使用情况,而不是我不得不做错误倾向性的猜测,然后屏住呼吸。我不能仅以文件大小来限制图像。具有高度压缩的高分辨率JPG的小文件可能占用比具有低分辨率PNG的大文件更多的内存。这就是为什么我必须回到我上面提到的计算。 – deceze 2009-07-13 03:08:41

0

最好的办法就是停下来试图弄清楚它需要多少内存,并且一开始就把它最大化 - 如果你有4GB的空间,告诉镜像脚本使用2到4GB左右,当脚本结束时,让它恢复正常,这将覆盖所有潜在的致命情况。这是唯一的“万无一失”的办法,我能想到的反正...

+0

这就是我想要做的,但在共享主机上很少可能。对于这些情况,我正在进行最佳猜测计算,以防止挂断。 – deceze 2009-07-13 07:31:26

+0

将PHP内存限制设置为等于系统具有的RAM总量或远程附近的任何位置,将允许用户通过映像脚本对DOS进行DOS操作。确定事先需要多少内存是我能想到的唯一方法将阻止这种类型的DOS。 – 2017-08-13 19:23:43

1

还有另一种方式做到这一点,但它可以是费时,作为图像编辑过程中的某些部分会被重复许多时间,但可以将内存限制设置为估计值,然后尝试处理映像,如果失败则捕获异常,增加内存限制,然后再次处理映像 - 重复此操作直至您成功或达到某个内存限制 - 此时你会向用户发出错误信息,说明他们的图片太大而无法使用。

编辑:为了赶上内存外的错误,你可以使用此解决方案:http://au2.php.net/set_error_handler#35622

+0

再次阅读,AFAIK没有任何可捕捉的东西被抛出。这是一次性的工作或它不运作。除非你能告诉我如何捕捉内存不足的错误,这正是我所要求的。 :) – deceze 2009-07-14 02:02:10

+2

有赶上这些错误的方式:http://au2.php.net/set_error_handler#35622 – jsnfwlr 2009-07-16 01:49:28

+0

我得看看这实际上帮助,由尼克指出,我不得不使用更多的内存在它发生之后处理错误。 – deceze 2009-07-26 05:38:05

3

创建图像后。

imagepng($image); 
imagedestroy($image); 

将删除存储问题

0

做一些测试,以检查多少内存每个gd功能需要。

  • imagecreatetruecolor似乎需要width*height*5 bytes

  • imagepng似乎需要width*height*4 bytes