Я пытаюсь обработать каталог изображений 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. Это походит на плохое обходное решение, которое могло потенциально привести к большему количеству проблем в будущем.
К вашему сведению: я запускаю свой скрипт от командной строки. Это не должно влиять на функциональность, но могло бы влиять на Ваш ответ, таким образом, я думал, что должен упомянуть это.
Кто-либо может видеть, пропускаю ли я просто что-то простое или если существует недостаток дизайна здесь? Вы думали бы, что это будет довольно простой задачей. Конечно, это должно быть возможно, правильно?
Возможно, что одно или несколько изображений действительно увеличиваются до 16 МБ в необработанной памяти. Один из способов проверить - открыть его в Photoshop или Irfanview и проверить цветовое пространство и размеры в пикселях.
Для достижения 16 мегапикселей не нужно много времени, например, рассмотрим «скромную» 6-мегапиксельную камеру. Он создает изображение размером 3072 на 2048 пикселей. В байтах на цвет (RGB) исходный размер составляет:
3072 x 2048 x 3 = 18 874 368
Таким образом, вы можете захотеть увеличить память в соответствии с самыми большими изображениями, которые вы ожидаете обработать. Но вы должны учитывать их исходный размер.
Просто используйте ini_set ();
и установите memory_limit на любой желаемый размер.