PHP GD Позволенная емкость памяти исчерпывается

Я пытаюсь обработать каталог изображений JPEG (примерно 600 +, в пределах от 50k к 500k) использующий PHP: GD, чтобы изменить размер и сохранить образы, но я наткнулся на что-то вроде препятствия довольно рано в процессе. После корректной обработки всего 3 изображений (30K, 18K и 231K) я добираюсь, Позволенная емкость памяти 16 777 216 байтов исчерпала Фатальную ошибку 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. Это походит на плохое обходное решение, которое могло потенциально привести к большему количеству проблем в будущем.

К вашему сведению: я запускаю свой скрипт от командной строки. Это не должно влиять на функциональность, но могло бы влиять на Ваш ответ, таким образом, я думал, что должен упомянуть это.

Кто-либо может видеть, пропускаю ли я просто что-то простое или если существует недостаток дизайна здесь? Вы думали бы, что это будет довольно простой задачей. Конечно, это должно быть возможно, правильно?

11
задан gurun8 13 May 2010 в 15:14
поделиться

3 ответа

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

проблема решена

18
ответ дан 3 December 2019 в 02:30
поделиться

Возможно, что одно или несколько изображений действительно увеличиваются до 16 МБ в необработанной памяти. Один из способов проверить - открыть его в Photoshop или Irfanview и проверить цветовое пространство и размеры в пикселях.

Для достижения 16 мегапикселей не нужно много времени, например, рассмотрим «скромную» 6-мегапиксельную камеру. Он создает изображение размером 3072 на 2048 пикселей. В байтах на цвет (RGB) исходный размер составляет:

3072 x 2048 x 3 = 18 874 368

Таким образом, вы можете захотеть увеличить память в соответствии с самыми большими изображениями, которые вы ожидаете обработать. Но вы должны учитывать их исходный размер.

13
ответ дан 3 December 2019 в 02:30
поделиться

Просто используйте ini_set (); и установите memory_limit на любой желаемый размер.

0
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: