Сегодня я добавил новую функцию в систему управления контентом, которую я создаю. В зависимости от того, где вы загружаете изображение, PHP изменит размер изображения в соответствии с назначенным местоположением. Он работает достаточно хорошо, но когда я пытаюсь загрузить более крупное изображение, как и в изображении 3 МБ, я получаю фатальную ошибку:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 42520 bytes) in...
Я думаю, что 128 МБ памяти довольно много, учитывая, что я не так много запускаю … по крайней мере, я так не думаю. Он попытался выделить еще 42520 байт для процесса изменения размера, но не удалось.
Мой вопрос: должен ли я (A) увеличить лимит или (B) переоценить, почему я использую так много памяти в первую очередь? Является ли 128 МБ хорошим числом или слишком велико / слишком мало?
Спасибо, Райан
РАЗРЕШАЮЩАЯ СПОСОБНОСТЬ
Я пришел к выводу, что 128MB действительно слишком много для изменения размера изображения, и я был настолько сосредоточен на поиске других параметров … например, параметров exec (), что я больше не рассматривал мои «примерные» данные. Оказывается, хотя мое большое изображение было всего 2,83 МБ, оно было более 10000 пикселей в ширину. Это проблема. 🙂
GD хранит изображения в виде растровых изображений в памяти, поэтому я не исключаю, что с некоторыми изображениями в формате JPG (например, с высоким разрешением, с высокой степенью сжатия) версия растрового изображения может быть довольно большой.
Вызовите memory_get_usage () прямо перед тем, как открыть и начать изменять размер изображения и посмотреть, слишком ли большой объем памяти.
Также просто FYI, когда скрипт говорит «(попытался выделить 42520 байт)», это не значит, что нужно всего 42520 байт для успешной работы. Это просто означает, что в этот момент ему понадобилось 42520 байт. Немного позже он, возможно, попытался выделить больше памяти. Таким образом, просто добавив 42520 байт к общей сумме памяти, возможно, ничего не зафиксировало бы.
Как вы изменяете размер изображения? Надеюсь, вы используете библиотечную функцию для него, как imagecopyresampled()
? Если это так, вам не нужно 128M RAM для изменения размера изображения 3M. Это указывает на то, что вы делаете что-то неправильно или неэффективно.
Вы не должны нуждаться в такой большой памяти. Переоценивайте код, чтобы уменьшить его потребление, и убедитесь, что вы не храните данные с избытком.
Грубая оценка того, сколько памяти потребляется с помощью изображения TrueColor:
width x height x 4
Если ваши пользователи информированы о максимальных размерах (в пикселях) загруженного изображения, вы можете определить минимальную RAM, которую вы должны выделить.
BTW, рассмотрите переменные, используемые в таких операциях, как преобразование формата, копирование и т. Д.
С 64mb вам нужно много работать. Если вам нужно больше, вам нужно что-то, что начнет очищать используемую память. 128Mb должен быть максимальным для скрипта, и это должен быть очень большой скрипт.