7

有没有办法防止 PHP GD 图像库内存不足?如果上传的图片太大,GD 往往会耗尽内存,终止脚本。我希望它抛出一个可捕获的异常或类似的东西,但可惜它没有。

现在我正在使用一个拼凑在一起的脚本,它首先发出一个ini_set('memory_limit', '128M'),如果这有效,我通常都准备好了。取决于服务器配置,尽管这可能是不可能的,所以我依靠一种算法来尝试估计所需的内存量(考虑分辨率、颜色深度、通道和软糖因素),然后将其与memory_get_usage()如果函数存在,则进行粗略估计。

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

4

6 回答 6

3

购买更多内存!:-P

不过说真的,处理内存不足是不可能的,因为你采取的任何行动都需要更多的内存。

您最好的选择是根据当前内存设置限制上传的图像大小。

于 2009-07-13T02:40:20.287 回答
2

创建图像后。

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

将消除内存问题

于 2012-04-18T17:58:51.373 回答
1

要捕获 PHP 的致命错误,例如“内存不足”或“PHP 致命错误:允许的内存大小为 8388608 字节已用尽(试图分配…字节)”,请参见此处: http: //php.net/manual/en/ function.set-error-handler.php#88401

于 2009-08-11T15:52:18.840 回答
1

还有另一种方法,但它可能很耗时,因为图像编辑过程的某些部分会重复多次,但您可以将内存限制设置为您的估计值,然后尝试处理图像,如果它未能捕获异常,则增加内存限制,然后再次处理图像 - 重复此操作直到您成功或达到某个内存限制 - 此时您会向用户抛出错误消息,解释他们的图像太大要使用的。

编辑:要捕获内存不足错误,您可以使用此解决方案: http: //au2.php.net/set_error_handler#35622

于 2009-07-14T01:11:54.323 回答
1

gd做一些测试来检查每个函数需要多少内存。

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

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

于 2012-06-28T01:23:10.370 回答
0

最好的办法是停止尝试计算它需要多少内存,并在一开始就将其最大化 - 如果你有 4 GB 可用,请告诉图像脚本使用 2 到 4 GB 左右,以及何时脚本结束,让它恢复正常,这将涵盖所有潜在的致命情况。无论如何,这是我能想到的唯一“故障安全”方式......

于 2009-07-13T06:51:21.080 回答