有没有办法防止PHP GD image library内存不足?如果上传的图像太大,GD往往会耗尽内存,从而终止脚本。我希望它可以抛出一个可捕捉的异常或其他东西,但是它没有。
现在我正在使用一个拼凑在一起的脚本,首先发出一个ini_set('memory_limit', '128M')
,如果有效,我通常都会设置。虽然可能无法实现服务器配置,但我还是试着估算所需的内存量(将分辨率,颜色深度,通道和软糖因素考虑在内),然后将其与如果函数存在,则memory_get_usage()
,否则进行粗略估计。
到目前为止,整个过程是有效的,但它远非优雅,并且在某些边缘情况下会失败,我敢肯定。有没有更好的方法来做到这一点,即GD必须优雅地失败,而不是将一切都停止?
答案 0 :(得分:3)
购买更多内存! :-P
说真的,不可能处理内存不足,因为你采取的任何行动都需要更多的内存。
最好的办法是根据当前的内存设置限制上传的图像大小。
答案 1 :(得分:3)
创建图像后。
imagepng($image);
imagedestroy($image);
将删除内存问题
答案 2 :(得分:1)
还有另一种方法,但它可能很耗时,因为图像编辑过程的某些部分会重复多次,但您可以将内存限制设置为估计值,然后尝试处理图像,如果失败捕获异常,增加内存限制,然后再次处理图像 - 重复此操作直到您成功或达到某个内存限制 - 此时您将向用户发出错误消息,说明他们的图像太大了,无法使用。
编辑:要捕获内存不足错误,您可以使用此解决方案:http://au2.php.net/set_error_handler#35622
答案 3 :(得分:1)
进行一些测试以检查每个gd
函数需要多少内存。
imagecreatetruecolor
似乎需要width*height*5 bytes
。
imagepng
似乎需要width*height*4 bytes
。
答案 4 :(得分:0)
你最好的办法就是不要试图弄清楚需要多少内存,一开始就把它最大化 - 如果你有4 GB可用,告诉图像脚本使用2到4 GB左右,当剧本结束时,让它恢复正常,这将掩盖所有可能致命的情况。这是我能想到的唯一“失败安全”方式......
答案 5 :(得分:0)
要捕获PHP的致命错误,例如“内存不足”或“PHP致命错误:允许的内存大小为8388608字节耗尽(试图分配......字节)”,请参见:http://php.net/manual/en/function.set-error-handler.php#88401