2010-05-13 66 views
9

我想处理一个JPEG图像(大约600+,范围从50k到500k)的目录使用PHP:GD来调整大小和保存图像,但我已经打了一点点在整个过程中很早就陷入困境。在正确处理了3张图像(30K,18K和231K)后,我得到一个允许的内存大小为16777216字节耗尽 PHP致命错误。PHP GD允许的内存大小用尽

我骑自行车经过图像并调用下面的代码:

list($w, $h) = getimagesize($src); 

    if ($w > $it->width) { 
     $newwidth = $it->width; 
     $newheight = round(($newwidth * $h)/$w); 
    } elseif ($w > $it->height) { 
     $newheight = $it->height; 
     $newwidth = round(($newheight * $w)/$h); 
    } else { 
     $newwidth = $w; 
     $newheight = $h; 
    } 

    // create resize image 
    $img = imagecreatetruecolor($newwidth, $newheight); 
    $org = imagecreatefromjpeg($src); 

    // Resize 
    imagecopyresized($img, $org, 0, 0, 0, 0, $newwidth, $newheight, $w, $h); 
    imagedestroy($org); 

    imagejpeg($img, $dest); 

    // Free up memory 
    imagedestroy($img); 

我试图释放与imagedestroy功能的内存,但它似乎并没有产生任何影响。该脚本只是在imagecreatefromjpeg代码行处始终持续窒息。

我检查了php.ini和memory_limit = 16M设置似乎它保持正确。但我无法弄清楚为什么记忆被填满。它不应该将内存释放回垃圾回收器吗?我真的不想增加memory_limit设置。这似乎是一个糟糕的解决方法,可能会导致未来出现更多问题。

仅供参考:我从命令提示符运行我的脚本。它不应该影响功能,但可能会影响你的反应,所以我想我应该提到它。

任何人都可以看到,如果我只是缺少一些简单的东西,或者如果这里有设计缺陷?你会认为这将是一个非常简单的任务。这当然是可以的,对吧?

回答

15
ini_set('memory_limit', '64M'); 

问题解决

+0

我会试试这个。我的猜测是它会在这个过程的后期出错。我希望我错了。 – gurun8 2010-05-13 15:56:39

+0

我错了。这工作。谢谢。 – gurun8 2010-05-13 16:06:35

+5

我想我应该刚发布了什么而不是为什么要做。 – JYelton 2010-05-13 16:07:59

12

有可能您的一个或多个图像在原始内存中实际膨胀到16M。一种检查方法是在Photoshop或Irfanview中打开它并检查色彩空间和像素尺寸。例如,考虑一个“低”600万像素的摄像头,它并不需要太多的达到16M。它创建了2072像素的2048像素图像。在每种颜色一个字节(RGB)的原始尺寸为:

3072×2048×3 = 18874368

所以,你可能需要根据你的期望进程的最大图像增加内存。但是你必须考虑他们的原始尺寸。

+0

我会检查出来。谢谢。 – gurun8 2010-05-13 15:26:36

+3

而gd不仅存储三个但每个像素四个字节〜25M – VolkerK 2010-05-13 15:28:07

+0

我认为这是一个alpha通道?好点,VolkerK。 – JYelton 2010-05-13 15:43:26

0

只需使用ini_set();并设置memory_limit的任何你想要的大小。

1

在某些情况下,您根本无法预测将要处理的图像所需的最高内存分配。为了避免撞车,你可以包括之前和你的循环后,下面的命令:

register_shutdown_function ('my_function'); 
$mem_limit = ini_get ('memory_limit'); 
ini_set ('display_errors', false); 
ini_set ('memory_limit', '400M');   // some high value 

(...你...进程)

ini_set ('memory_limit',$mem_limit); 
函数内

和地点 “创建my_function()”将处理崩溃的代码。

相关问题