0

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

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

如果图像小于 1MB,则不会出现此类错误。

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

无论如何要找出这个错误的根源并改变结果 - 或者我是否需要检查图像的大小,因为服务器将永远无法处理该大小的任何内容。(如果是这样,我怎么知道服务器的大小合适?)

4

3 回答 3

3

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

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

于 2013-08-27T12:32:35.623 回答
2

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

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

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

于 2013-08-27T12:44:59.657 回答
0
于 2013-08-27T13:32:51.983 回答