Есть ли способ предотвратить нехватку памяти в библиотеке изображений PHP GD ? Если слишком большое изображение загружено, GD имеет тенденцию заканчиваться из памяти, завершая сценарий. Я бы хотел, чтобы это бросило захватывающее исключение или что-то в этом роде, но, увы, этого не происходит.
Прямо сейчас я использую скрипт cobbled-together, который сначала выдает ini_set('memory_limit', '128M')
, если это работает, я обычно настроен. В зависимости от конфигурации сервера, хотя это может быть невозможно, поэтому я отказываюсь от алгоритма, который пытается оценить объем требуемой памяти (принимая во внимание разрешение, глубину цвета, каналы и коэффициент выдумки), затем сравнивает его с memory_get_usage()
если функция существует, в противном случае грубая оценка.
Все это работает до сих пор, но это далеко не изящно, и я уверен, что это не удастся. Есть ли лучший способ сделать это, т. Е. Иметь GD изящно, если нужно, вместо того, чтобы остановить все?
Купите больше памяти! :-П
Серьезно, однако, невозможно справиться с отсутствием памяти, потому что любое действие, которое вы предпримете, потребует больше памяти.
Лучше всего ограничить размер загружаемого изображения на основе текущих настроек памяти.
После создания изображения.
imagepng($image); imagedestroy($image);
устранит проблему с памятью
Есть и другой способ сделать это, но это может занять много времени, так как некоторые части процесса редактирования изображений будут повторяться несколько раз, но вы можете установить ограничение памяти на оценочное значение, затем попытаться обработать изображение, если это не удается устранить исключение, увеличьте ограничение памяти, а затем обработайте изображение еще раз – повторите это до тех пор, пока вы не добьетесь успеха или не достигнете определенного предела памяти – в этот момент вы выбросите сообщение об ошибке пользователю, объяснив, что их изображение слишком велико быть использованным.
Изменить: Чтобы поймать ошибку вне памяти, вы можете использовать это решение: http://au2.php.net/set_error_handler#35622
Лучше всего остановиться на том, чтобы не пытаться выяснить, сколько бара ему понадобится, и просто максимизировать его с самого начала – если у вас есть 4 ГБ, скажите сценарию изображения использовать от 2 до 4 ГБ или около того, и когда сценарий заканчивается, верните ли он нормальный режим, который будет закрывать все потенциально фатальные ситуации. Это единственный «безопасный» способ, о котором я могу думать в любом случае …
Чтобы уловить фатальные ошибки PHP, такие как «Out of memory» или «PHP Fatal error: разрешенный размер памяти 8388608 байт, израсходованный (попытался выделить … байты)», см. Здесь: http://php.net/manual/en/ function.set-ошибок handler.php # 88401
Проведите несколько тестов, чтобы проверить, сколько памяти требуется каждой функции gd
.
imagecreatetruecolor
похоже, требуется width*height*5 bytes
.
imagepng
похоже, требуется width*height*4 bytes
.