2008-12-23 95 views
1

我不确定内存是否是罪魁祸首。我试图从内存中的数据实例化GD图像(它以前来自数据库)。我试着打电话这样的:如何防止GD耗尽内存?

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

$image回来为undef。 GD的POD表示,对于内存不足的情况,构造函数将返回undef,所以这就是我怀疑内存的原因。

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

这适用于像30K以下的非常小的图像。然而,稍大的图像,像〜70K会导致问题。我不认为7K图像应该会导致这些问题,即使在它被瘪了之后。

此脚本通过Apache 2.0在OS 10.4上运行,如果这很重要的话。

默认情况下Apache是​​否有任何内存限制?他们能增加吗?

感谢您的任何见解!

编辑:为了澄清,GD :: Image对象永远不会被创建的,所以清理出从内存中$image_data是不是一个真正的选择。

回答

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分别的内存,它释放出来,足以应付更多的处理。

+0

如何增加可用于脚本的内存量?我不认为其他解决方案可以工作,因为我从来没有通过创建第一个GD :: Image对象。 – pkaeding 2008-12-23 12:32:28

+0

IIRC在php中有一个设置。ini关于脚本内存限制 – 2008-12-24 02:27:45

1

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

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

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

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

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