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


PHP Fatal Error: Out of Memory when creating an image

我有一个简单的PHP脚本,它获取上传的图像并用imagecreatefromjpeg进行处理。它适用于小图像,但不适用于大图像。对于一个5799936字节的图像,我得到以下错误:

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

如果图像小于1MB,我不会得到这样的错误。

我已经确保每当图像被成功处理时,我总是使用imagedestroy,并且我已经使用memory_get_usage()来查看当前正在使用的内容(186260)。

有没有办法找出这个错误的根源并改变结果——或者我需要检查图像的大小,因为服务器永远无法处理这个大小的任何东西。(如果是,我如何判断服务器的大小合适?)

不是文件大小,而是图像的大小需要一定的内存。您可以从熟悉的getimagesize()函数中获得所需的尺寸。

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

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

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

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

感谢您的常识和Pekka的帮助웃我尝试了各种像素尺寸,直到我大致了解了服务器可以处理的数字。对我来说,一张图片大约有10200000个像素。

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