PHP GD允许的内存大小耗尽

时间:2010-05-13 15:14:54

标签: php gd

我正在尝试使用PHP:GD来处理JPEG图像目录(大约600+,范围从50k到500k)以调整大小并保存图像但我在这个过程中很早就遇到了一些障碍。正确处理3个图像(30K,18K和231K)后,我得到允许的内存大小为16777216字节耗尽 PHP致命错误。

我正在浏览图像并调用下面的代码:

    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设置。这似乎是一个糟糕的解决方法,可能会在未来导致更多问题。

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

任何人都可以看到我是否只是遗漏了一些简单的东西,或者这里是否存在设计缺陷?你认为这将是一个非常简单的任务。当然这必须是可能的,对吗?

4 个答案:

答案 0 :(得分:17)

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

问题解决了

答案 1 :(得分:13)

您的一个或多个图像可能实际上在原始内存中膨胀到16M。一种检查方法是在Photoshop或Irfanview中打开它并检查颜色空间和像素尺寸。

达到16M并不需要太多,例如,考虑一个“低”的600万像素摄像头。它创建了一个3072像素乘2048像素的图像。每个颜色的字节数(RGB),原始大小为:

  

3072 x 2048 x 3 = 18,874,368

因此,您可能希望根据预期处理的最大图像增加内存。但你必须考虑它们的原始尺寸。

答案 2 :(得分: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()”中放置将处理崩溃的代码。

答案 3 :(得分:0)

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