Является ли ограничение памяти PHP 128 МБ много? - PullRequest
1 голос
/ 07 октября 2010

Сегодня я добавил новую функцию в систему управления контентом, которую я строю.В зависимости от того, куда вы загружаете изображение, PHP изменит размер изображения в соответствии с указанным местоположением.Это работает довольно хорошо, но когда я пытаюсь загрузить изображение большего размера, как на изображении размером 3 МБ, я получаю фатальную ошибку:

Fatal error: Allowed memory size of 134217728 bytes exhausted 
(tried to allocate 42520 bytes) in...

Я думаю, что 128 МБ памяти это довольно много,учитывая, что я не слишком много бегаю ... по крайней мере, я так не думаю.Он попытался выделить еще 42520 байт для процесса изменения размера, но не смог.

Мой вопрос заключается в том, должен ли я (A) увеличить лимит или (B) переоценить, почему я использую так много памяти в первомместо?128MB - это хорошее число или оно слишком большое / слишком маленькое?

Спасибо, Райан

РАЗРЕШЕНИЕ

Я пришел к выводу, что 128MB - это действительно слишком многодля изменения размера изображения, и я был так сосредоточен на рассмотрении других опций ... например, опций exec (), что я никогда не рассматривал свои "примерные" данные.Оказывается, что хотя мое большое изображение было всего 2.83MB, оно было более 10000 пикселей в ширину.Это проблема.:)

Ответы [ 5 ]

6 голосов
/ 07 октября 2010

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

Вызовите memory_get_usage () прямо перед тем, как открыть и начать изменять размер изображения и посмотреть, не слишком ли велик этот объем памяти.

Также только к сведению, когда скрипт говорит «(пытался выделить 42520 байт)», это не значит, что для успешной работы ему просто нужно еще 42520 байт. Это просто означает, что в тот момент ему понадобилось еще 42520 байт. Чуть позже он мог попытаться выделить больше памяти. Таким образом, простое добавление 42520 байтов к общему объему памяти, скорее всего, ничего не исправит.

2 голосов
/ 07 октября 2010

Как вы меняете размер изображения?Я надеюсь, что вы используете библиотечную функцию для этого типа imagecopyresampled()?Если это так, вам не нужно 128M RAM для изменения размера 3M изображения.Это указывает на то, что вы делаете что-то неправильно или неэффективно.

0 голосов
/ 07 декабря 2010

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

0 голосов
/ 07 октября 2010

Грубая оценка того, сколько памяти используется изображением TrueColor:

width x height x 4

Если ваши пользователи проинформированы о максимальных размерах (в пикселях) загружаемого изображения, вы можете определить минимальный объем ОЗУ, который вам нужно выделить.

Кстати, рассмотрим переменные, используемые в таких операциях, как преобразование формата, копирование и т. Д.

0 голосов
/ 07 октября 2010

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

...