【问题标题】:PHP: out of memory error, what to do?PHP:内存不足错误,怎么办?
【发布时间】:2010-11-11 20:28:44
【问题描述】:

我在尝试裁剪图像时收到此错误,我刚刚上传。我刚刚上传的图片大约 3MB。

这是错误

<br />
<b>Fatal error</b>:  Out of memory (allocated 45088768) (tried to allocate 15552 bytes) <br />

当我尝试使用此功能时会发生这种情况:imagecreatefromjpeg($src);

我在顶部:

ini_set('memory_limit', '256M'); 

那么它怎么会内存不足,我应该如何解决这个问题?我的图片上传标准限制为 6MB。 (虽然它可以很好地上传到服务器,但是当我使用裁剪时,我在使用 imagecreatefromjpeg() 函数时遇到错误,并且“内存不足..”)

【问题讨论】:

  • 如果你这样做 ini_set('memory_limit', -1); 会发生什么?这应该禁用限制。另外,您使用的是什么版本的 PHP 以及什么操作系统?
  • 我仍然收到 -1 错误
  • 错误消息的(已分配 45088768)部分表明 memory_limit 已禁用,无法从脚本中更改
  • 好的,刚刚和我的主人核实了一下。他们说他们最多给我 64MB 的限制,我该怎么办?

标签: php memory-limit suhosin


【解决方案1】:

在执行image processing with GD 时,始终使用imagedestroy 释放已使用的内存并尽早执行。因此,当您不再需要图像资源时,请立即使用imagedestroy 将其销毁。

【讨论】:

  • 不错的函数,但是在crop() 之前我没有gd 库中的任何东西是否有其他函数可以将内存释放到诸如pathinfo() 之类的东西;或 exif_imagetype();
【解决方案2】:

PHP 通常允许您在运行时更改 memory_limit 设置。但是有一些扩展,比如 Suhosin,会禁用这种行为。检查您的 PHP 设置是否使用 phpinfo() 加载了 Suhosin 扩展。如果是这样,请检查 *suhosin.memory_limit* 设置是否设置为 0。如果是,这将解释此行为(不更新 memory_limit),您必须联系系统管理员以提高该限制。

另见http://www.hardened-php.net/suhosin/configuration.html#suhosin.memory_limit

【讨论】:

  • 鉴于我上面评论的答案,这很可能是问题所在。 +1
  • @Johnson 你可能不知道你是——例如,Ubuntu 默认启用它。你检查过 phpinfo() 吗?
  • 好的,刚刚和我的主人核实了一下。他们说他们最多给我 64MB 的限制,我该怎么办?
  • 嗯,三件事之一:1)使用较小的图像来减少你的内存占用,2)通过使用 imagemagick(或某种工具:nodstrum.com/2007/02/06/imagemagick_manipulation)来作弊——这当然是仅当主机安装了此功能时才有效,或者 3) 将主机提供商更改为不那么严格的 :)。
【解决方案3】:

一个安全的解决方案是应用一些过滤器来阻止图像处理(或至少给出一些警告),当进程需要比允许的限制更多的内存时。 imgcreatefromjpeg 上的 PHP 手册有一些用户功能(检查评论),可以计算处理图像所需的内存。根据计算,您可以限制上传图片的最大尺寸,以防止用户触发内存限制错误。

注意:不要忘记在计算中增加几 MB。

但如果你坚持不限制图像大小,请尝试要求主机增加内存限制或使用第三方服务,如Google Images Python Api

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 2012-10-25
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多