2010-04-19 102 views
3

我创建缩略图,通过大量的图片循环,当我找到一个大的图像,我得到:imagejpeg内存耗尽

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

非常感谢!

+1

添加更多内存或处理较小的图像。这是gdlib常见的问题,这就是为什么我更喜欢imagemagick。 – elias 2010-04-19 15:27:05

回答

1

有一些调试工具,将 告诉我什么时候内存 耗尽?

您可以使用memory_get_usagememory_get_peak_usage

而具体,会告诉我,如果 存在变数/阵列被 杀死了我的记忆?

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

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

3

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

+0

我已经这样做了,它看起来像在这条线上死去:$ source = imagecreatefromjpeg($ imgfile); – 0plus1 2010-04-19 15:18:41

+0

你在某处仍然有内存泄漏。确保你在源和目标GD资源上都做了一个'imagedestroy'。 – mattbasta 2010-04-19 17:20:27