Как я могу предотвратить исчерпание памяти GD? - PullRequest
1 голос
/ 23 декабря 2008

Я не уверен, что память здесь виновна. Я пытаюсь создать экземпляр изображения 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 по умолчанию? Могут ли они быть увеличены?

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

EDIT: Для пояснения, объект GD :: Image никогда не создается, поэтому удаление $image_data из памяти на самом деле не вариант.

Ответы [ 2 ]

1 голос
/ 28 ноября 2009

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

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

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

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

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

0 голосов
/ 23 декабря 2008

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

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

Оригинальный скрипт:

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

...