提问人:deceze 提问时间:7/13/2009 最后编辑:deceze 更新时间:10/20/2012 访问量:8925
防止 GD 图像库内存不足的故障安全方法?(菲律宾比索)
A fail-safe way to prevent GD image library from running out of memory? (PHP)
问:
有没有办法防止 PHP GD 镜像库内存不足?如果上传的图像太大,GD 往往会耗尽内存,从而终止脚本。我希望它抛出一个可捕获的异常或其他东西,但可惜它没有。
现在我正在使用一个拼凑在一起的脚本,它首先发出一个 ,如果它有效,我通常就准备好了。根据服务器配置,这可能是不可能的,所以我会使用一种算法来尝试估计所需的内存量(考虑到分辨率、颜色深度、通道和软糖因素),然后将其与函数是否存在进行比较,否则进行粗略估计。ini_set('memory_limit', '128M')
memory_get_usage()
到目前为止,整个事情都有效,但它远非优雅,我敢肯定,在某些极端情况下会失败。有没有更好的方法可以做到这一点,即如果有必要,让 GD 优雅地失败,而不是让一切都停下来?
答:
购买更多内存!9-3
但说真的,处理内存不足是不可能的,因为您采取的任何操作都需要更多的内存。
最好的办法是根据当前内存设置限制上传的图像大小。
评论
最好的办法是停止试图弄清楚它需要多少内存,并在一开始就将其最大化 - 如果您有 4 GB 可用空间,请告诉映像脚本使用 2 到 4 GB 左右,当脚本结束时,让它恢复正常,这将涵盖所有潜在的致命情况。无论如何,这是我能想到的唯一“故障安全”方法......
评论
还有另一种方法可以做到这一点,但它可能很耗时,因为图像编辑过程的某些部分会重复多次,但您可以将内存限制设置为您的估计值,然后尝试处理图像,如果它失败捕获异常,增加内存限制,然后再次处理图像 - 重复此操作,直到您成功或达到某个内存限制 - 此时您会向用户抛出一条错误消息,说明他们的图像太大而无法使用。
编辑:要捕获内存不足错误,您可以使用以下解决方案:https://www.php.net/set_error_handler#35622
评论
要捕获PHP的致命错误,例如“内存不足”或“PHP致命错误:允许的内存大小为8388608字节耗尽(尝试分配...bytes) in“,请参阅此处:http://php.net/manual/en/function.set-error-handler.php#88401
评论
创建映像后。
imagepng($image);
imagedestroy($image);
将消除内存问题
评论
做一些测试来检查每个函数需要多少内存。gd
imagecreatetruecolor
似乎需要.width*height*5 bytes
imagepng
似乎需要.width*height*4 bytes
评论
imagecreatetruecolor
下一个:构造函数或赋值运算符
评论