如何防止GD耗尽内存?

时间:2008-12-23 04:49:49

标签: perl gdlib

我不确定记忆是否是罪魁祸首。我试图从内存中的数据实例化GD图像(它以前来自数据库)。我尝试这样的电话:

my $image = GD::Image->new($image_data);

$imageundef的形式返回。对于GD的POD说,构造函数将返回undef以查找内存不足的情况,这就是我怀疑内存的原因。

图像数据为PNG格式。如果我调用newFromPngData,也会发生同样的事情。

这适用于非常小的图像,例如30K以下。但是,像~70K这样稍大的图像会导致问题。我不认为70K图像会导致这些问题,即使它已经缩小了。

如果重要的话,这个脚本在OS 10.4下通过Apache 2.0在CGI下运行。

默认情况下Apache是​​否存在内存限制?他们可以增加吗?

感谢您的任何见解!

编辑:为了澄清,GD :: Image对象永远不会被创建,因此从内存中清除$image_data实际上不是一种选择。

2 个答案:

答案 0 :(得分:1)

GD库每个字节的图像大小占用很多字节。这是一个超过10:1的比例!

当用户将图像上传到我们的系统时,我们首先检查文件大小,然后再将其加载到GD图像中。如果超过阈值(1兆字节),我们不会使用它,而是向用户报告错误。

如果我们真的关心我们可以将其转储到磁盘,请使用命令行“convert”工具将其重新调整为合理的大小,然后将输出加载到GD库中并删除临时文件。

convert -define jpeg:size=800x800 tmpfile.jpg -thumbnail '800x800' -

将缩放图像,使其适合800 x 800平方。它的最长边缘现在是800px,应该可以安全地加载。上面的命令会将收缩的.jpg发送到STDOUT。 size =选项应该告诉转换不要在内存中保留巨大的图像,但只能扩展到800x800。

答案 1 :(得分:0)

我几次遇到同样的问题。

我的一个解决方案就是增加脚本可用的内存量。另一个是清除缓冲区:

原始剧本:

$src_img = imagecreatefromstring($userfile2);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_width,$thumb_height,$origw,$origh);

编辑脚本:

$src_img = imagecreatefromstring($userfile2);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_width,$thumb_height,$origw,$origh);
imagedestroy($src_img);

通过清除第一个src_image的内存,它释放得足以处理更多的处理。