Отказоустойчивый способ предотвратить исчерпание памяти в библиотеке изображений GD? (PHP) - PullRequest
6 голосов
/ 13 июля 2009

Есть ли способ предотвратить исчерпание памяти в библиотеке изображений PHP GD ? Если загружено слишком большое изображение, GD имеет тенденцию исчерпывать память, завершая сценарий. Я бы хотел, чтобы оно генерировало ловимое исключение или что-то в этом роде, но, увы, это не так.

Прямо сейчас я использую сценарий "cobbled-Together", который сначала выдает ini_set('memory_limit', '128M'), если это работает, я обычно все готово. Однако в зависимости от конфигурации сервера это может оказаться невозможным, поэтому я прибегаю к алгоритму, который пытается оценить объем необходимой памяти (с учетом разрешения, глубины цвета, каналов и коэффициента выдумки), а затем сравнивает его с memory_get_usage() если функция существует, в противном случае выполняется грубая оценка.

Пока все работает, но далеко не элегантно и, в некоторых случаях, не получится, я уверен. Есть ли лучший способ сделать это, то есть, если GD изящно потерпит неудачу, если нужно, вместо того, чтобы все замять?

Ответы [ 6 ]

3 голосов
/ 18 апреля 2012

После создания изображения.

imagepng($image);
imagedestroy($image);

устранит проблему с памятью

3 голосов
/ 13 июля 2009

Купи больше памяти! : -Р

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

Лучше всего ограничить размер загружаемого изображения на основе текущих настроек памяти.

1 голос
/ 28 июня 2012

Проведите несколько тестов, чтобы проверить, сколько памяти требуется каждой gd функции.

  • imagecreatetruecolor, кажется, нужно width*height*5 bytes.

  • imagepng, кажется, нужно width*height*4 bytes.

1 голос
/ 14 июля 2009

Есть еще один способ сделать это, но это может занять много времени, так как некоторые части процесса редактирования изображения будут повторяться несколько раз, но вы можете установить предел памяти для вашего оценочного значения, затем попытаться обработать изображение, если оно терпит неудачу, ловит исключение, увеличивает предел памяти, затем обрабатывает изображение снова - повторяя это, пока вы не добьетесь успеха или не достигнете определенного предела памяти - в этот момент вы выдадите пользователю сообщение об ошибке, объясняющее, что его изображение слишком велик для использования.

Редактировать: чтобы поймать ошибку нехватки памяти, вы можете использовать это решение: http://au2.php.net/set_error_handler#35622

0 голосов
/ 11 августа 2009

Чтобы перехватить фатальные ошибки PHP, такие как «Недостаточно памяти» или «Фатальная ошибка PHP: допустимый объем памяти 8388608 байт исчерпан (попытка выделить… байтов) в», см. Здесь: http://php.net/manual/en/function.set-error-handler.php#88401

0 голосов
/ 13 июля 2009

Лучше всего перестать пытаться выяснить, сколько оперативной памяти ему понадобится, и просто максимально увеличить его с самого начала - если у вас есть 4 ГБ, скажите сценарию изображения использовать от 2 до 4 ГБ, и когда сценарий завершится, верните его в нормальное состояние, что покроет все потенциально фатальные ситуации. Это единственный «безотказный» способ, о котором я могу думать ...

...