imagejpeg 内存耗尽

3

我正在创建缩略图并循环浏览许多图像,当我找到一个大图像时,会出现以下情况:

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);

?

Thank you very much!


1
增加更多的内存或者处理较小的图像。这是gdlib常见的问题,这就是为什么我更喜欢imagemagick的原因。 - elias
2个回答

3

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


我已经执行了这个操作,但它似乎在这行代码出现问题:$source=imagecreatefromjpeg($imgfile); - 0plus1
你的代码中仍然存在内存泄漏。请确保在源GD资源和目标GD资源上都执行了imagedestroy操作。 - mattbasta

1
有没有一些调试工具可以准确地显示内存何时耗尽?
您可以使用memory_get_usagememory_get_peak_usage 那么有没有特别的工具可以显示哪些变量/数组正在消耗我的内存?
有时候,变量只是资源持有者,本质上指向可能在其他语言中创建的数据结构。PHP无法测量这些。只需在代码中可疑的行之后使用内存使用函数来缩小罪魁祸首。
某些设置(如共享主机)限制了您修改内存要求的能力。这些限制可以在PHP、Web服务器和/或操作系统级别实现。您需要通过调用phpinfo()来确保您的memory_limit请求成功。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接