【问题标题】:imagejpeg memory exhaustionimagejpeg 内存耗尽
【发布时间】:2011-02-09 17:52:06
【问题描述】:

我正在创建循环浏览大量图像的缩略图,当我找到一张大图像时:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 13056 bytes)

现在我已经知道如何规避:

ini_set('memory_limit', '-1');

我想知道的是为什么它会耗尽内存!是否有一些调试工具可以准确显示内存何时耗尽?具体来说,这会告诉我是否有变量/数组正在扼杀我的记忆?

或者,有没有更好的方法来调整图像大小:

$thumb=imagecreatetruecolor($newwidth,$newheight); 
$source=imagecreatefromjpeg($imgfile);
imagecopyresampled($thumb,$source,0,0,0,0,$newwidth,$newheight,$width,$height);
imagejpeg($thumb,$destinationfile,85);

?

非常感谢!

【问题讨论】:

  • 添加更多内存或处理较小的图像。这是 gdlib 的一个常见问题,这就是我更喜欢 imagemagick 的原因。

标签: php image-processing memory-leaks


【解决方案1】:

是否有一些调试工具可以 准确地告诉我记忆是什么时候 累吗?

您可以使用memory_get_usagememory_get_peak_usage

特别是这会告诉我,如果 有变量/数组是 杀死我的记忆?

有时变量只是资源持有者,本质上指向可能用其他语言创建的数据结构。 PHP 无法测量这些。只需在代码中的可疑行之后使用内存使用函数来缩小罪魁祸首。

某些设置(如共享主机)会限制您修改内存要求的能力。这些限制可以在 PHP、Web 服务器和/或操作系统级别实现。您需要通过调用 phpinfo() 来确保您的 memory_limit 请求成功。

【讨论】:

    【解决方案2】:

    您可能需要在处理完每个图像后调用imagedestroy()(即$source$thumb),尤其是在处理大量图像时。 我不确定PHP的垃圾回收是否会清除GD图像资源。

    【讨论】:

    • 我已经这样做了,看起来它在这一行快要死了:$source=imagecreatefromjpeg($imgfile);
    • 您在某处仍有内存泄漏。确保您在源 GD 资源和目标 GD 资源上都使用imagedestroy
    猜你喜欢
    • 2015-08-23
    • 2012-11-10
    • 2012-08-19
    • 2015-10-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多