Как я могу предотвратить исчерпание памяти GD?

Я не уверен, что память здесь виновата. Я пытаюсь создать экземпляр изображения GD из данных в памяти (ранее это было из базы данных). Я пытаюсь позвонить так:

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

$image возвращается как undef, POD для GD говорит, что конструктор вернет undef для случаев недостаточной памяти, поэтому я подозреваю, что память.

Данные изображения в формате PNG. То же самое происходит, если я вызываю newFromPngData.

Это работает для очень маленьких изображений, например, под 30K. Тем не менее, немного большие изображения, такие как ~70K, вызовут проблему. Я не думаю, что изображение 70K должно вызывать эти проблемы, даже после того, как оно спущено.

Этот сценарий работает под CGI через Apache 2.0, на OS 10.4, если это вообще имеет значение.

Есть ли какие-либо ограничения памяти, налагаемые Apache по умолчанию? Могут ли они быть увеличены?

Спасибо за понимание!

РЕДАКТИРОВАТЬ: Для пояснения, объект GD::Image никогда не создается, поэтому очистка $image_data из памяти на самом деле не вариант.

2 ответа

Библиотека GD потребляет много байтов на байт размера изображения. Это соотношение более 10:1!

Когда пользователь загружает изображение в нашу систему, мы начинаем с проверки размера файла перед загрузкой его в изображение GD. Если он превышает пороговое значение (1 мегабайт), мы не используем его, а вместо этого сообщаем пользователю об ошибке.

Если мы действительно заботимся о том, что мы можем выгрузить его на диск, используйте инструмент "конвертировать" из командной строки, чтобы изменить его размер до нормального, затем загрузите вывод в библиотеку GD и удалите временный файл.

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

Масштабирует изображение, чтобы оно соответствовало квадрату 800x800. Его самый длинный край теперь 800px, который должен безопасно загружаться. Приведенная выше команда отправит сжатый файл.jpg в STDOUT. Опция size= должна указывать конвертированию не мешать удерживать огромное изображение в памяти, но достаточно для масштабирования до 800x800.

Я сталкивался с той же проблемой несколько раз.

Одним из моих решений было просто увеличить объем памяти, доступной для моих скриптов. Другой должен был очистить буфер:

Оригинальный сценарий:

$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, он освободился достаточно для обработки большего количества обработки.

Другие вопросы по тегам