php GD image library 图片上传时出现内存不足的解决方法

图片上传时出现内存不足的错误

有没有一种可以防止php GD image library运行时出现内存不足的方法?当上传一张大图片时,GD就有可能用尽内存,终止脚本的运行。我比较喜欢其能抛出一段错误描述,但并没有这样。

现在我在脚本里首先设置ini_set(‘memory_limit’, ‘128M’),如果凑效我就这么设置了。但根据服务器设置这是不可能的,所以我又不得不回到计算法则去估算内存的大概使用量,然后与memory_get_usage()做比较(如果这个函数存在的话),否则只能是粗略估算了。

这样处理是可以达到目的了,但是处理方式不够简洁,并且有时候它也不能成功。我相信会有更好的办法,例如GD可以返回更好的异常,而不是遇到什么事情只有停止。

◆讨论一:

有网友认为操作内存不太可能,因为任何动作都会消耗内存。其建议最好的办法是根据当前内存设置来限制上传图片的大小。

但我更喜欢让GD来判断内存的使用量,不能单单显示上传文件大小这样来处理。因为一张经过高压缩、高分辨率的JPG小图片,使用内存比一张经过低压缩、低分辨率的PNG大图片还要多。这就是为什么我要重新回到内存估算的处理方法上来的原因。

◆讨论二:

某网友说可以不去计算内存消耗,而是设定一个最大内存使用值,例如你有4G可以内存,那么图片处理可以设置用2G-4G,一旦超出这个数值,就停止执行脚本,这么避免隐藏的严重错误。

对于此网友的方法,我认为也是可行的,可是对于共享主机来说,这是无法实现的。我现在只是估算以防止事件挂起。

◆讨论三:

捕抓PHP严重错误,如“Out of memory”或“PHP Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate … bytes) in”。

我认为这个方法不可行。一旦一个PHP脚本出现“Out of memory”,它就不能调用关闭函数因为那需要分配更多的内存。

◆总结:问题如何解决?到目前为止我还没有一个更好的解决方案。我希望能有办法做到在出现“Out of memory”问题时GD抛出异常,但这好像是一个不可能实现的事件。

小知识:GD 是一个开源的图像处理库,支持 PNG/JPEG/GIF以及其他格式的图像。GD一般被用来创建图表、图形、缩略图以及其他图像相关的处理操作。

参考:PHP生成缩略图出现内存不足的解决方法

用php生成缩略图,操作300kb+的jpg图片都没问题,但是操作220kb左右的png图片就显示内存用尽,
Allowed memory size of 8388608 bytes exhausted (tried to allocate 3715200 bytes;。。。

出现这个问题的解决方法是把分配给php的内存设置大一些,在图片处理的页面添加ini_set(“memory_limit”,”12M”);

添加之后的内存限制仅对本页面有效,不用担心对其他程序产生影响。

实例:PHP ini_set 用法

ini_set具有更改php.ini设置的功能。此函数接收两个参数:需要调整的配置变量名,以及变量的新值。

例如,在某脚本出现时增加最大执行时间(maximum execution time):

<?php
ini_set(‘max_execution_time’, 600)
// more code
?>

这样的设置将仅仅影响被设置的脚本。一旦脚本执行完毕,该变量将自动恢复到原始值。