PHP致命错误:创建图像时内存不足

时间:2013-08-27 12:25:48

标签: php gd

我有一个简单的PHP脚本,它采用已上传的图像并使用imagecreatefromjpeg对其进行处理。它适用于小图像,但不适用于较大的图像。使用5,799,936字节的图像,我收到以下错误:

Fatal error: Out of memory (allocated 56623104) (tried to allocate 3072 bytes)

如果图像小于1MB,我就不会出现这样的错误。

我确保无论何时成功处理图片,我都会使用imagedestroy,并且我已使用memory_get_usage()查看当前正在使用的内容(186260)。

无论如何都要找到这个错误的底部并改变结果 - 或者我是否需要检查图像的大小,因为服务器永远不能处理那么大的任何东西。 (如果是这样,我怎么知道服务器的大小是否合适?)

3 个答案:

答案 0 :(得分:3)

它不是文件大小,但图像大小需要一定量的内存。您可以从熟悉的getimagesize()函数中获取所需的维度。

要计算尺寸限制,只需获取可调整大小的文件,获取其尺寸,使用memory_get_peak_usage()测量消耗的内存并将其除以图像中的像素数。 Yu将获得粗略系数,它将告诉您允许的尺寸

答案 1 :(得分:2)

@Common Sense概述的方式是尝试并预测调整大小进程将消耗多少内存的唯一方法。它永远不会100%准确但具有合适的安全系数,它可能就足够了。

我想到的另一个选择是触发一个单独的PHP进程来尝试调整大小操作(通过file_get_contentsexec())。如果该操作因致命错误而失败,您可以捕获它并向用户显示一条友好的消息,告知他们的图像太大。

如果您可以在服务器上安装二进制文件,您还可以考虑依赖ImageMagick等外部工具来调整大小。命令行工具的内存使用量不计入您的PHP内存限制。

答案 2 :(得分:0)

感谢Your Common SensePekka웃的帮助,我尝试了各种像素尺寸,直到我粗略了解服务器可以处理的数量。对我来说,单个图像中大约有10,200,000像素。

然后我使用getimagesize()来获取任何上传图片的高度和宽度,并检查以查看总像素数。如果它超过10,200,000,我会在到达imagecreatefromjpeg之前抛出异常,让用户知道调整大小和图像。