разумный PHP memory_limit для изменения размера изображения - PullRequest
0 голосов
/ 09 февраля 2009

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

Я использовал Pear Image_Transform, но я продолжал получать "исчерпанные байты" фатальные ошибки на некоторых типах jpgs (все файлы пробовали менее 2 Мб). Поэтому я перешел на выделенный сервер с двухъядерным процессором Pentium E5200 @ 2,50 ГГц и оперативной памятью 2 ГБ. Загрузил тот же код изменения размера изображения - та же ошибка. Я увеличил объем оперативной памяти в php.ini до 64M, но на некоторых типах jpg сайт получил ту же проблему. Также пробовал широкоформатный класс - та же ошибка (ошибка всегда с imagecreatefromjpeg ()). (Используя GD2). Все отлично работает локально на моем Mac.

Это действительно проблема с памятью, какой разумный предел памяти для моей настройки + изменения размера изображения?

Ответы [ 6 ]

2 голосов
/ 09 февраля 2009

Примерный пример того, сколько памяти вам понадобится, можно рассчитать следующим образом:

$imageInfo = getimagesize( $sourceImagePath );

// a check to make sure we have enough memory to hold this image
$requiredMemoryMB = ( $imageInfo[0] * $imageInfo[1] * ($imageInfo['bits'] / 8) * $imageInfo['channels'] * 2.5 ) / 1024;

Это довольно грубо и включает коэффициент выдумки 2.5, с которым вы можете поэкспериментировать.

1 голос
/ 06 мая 2013

Не существует безопасного способа установки достаточного (или безопасного, не сбойного) предела памяти для PHP для изменения размера изображения, если размер изображения может быть произвольного размера.

Лучшим решением было бы изменение размера через командную строку PHP CLI через установленный ImageMagic - таким образом, память PHP не используется, вместо нее будет использоваться память ОС.

См. Команду преобразования CLI:

http://www.imagemagick.org/script/convert.php

1 голос
/ 09 февраля 2009

90 Мб памяти для формата 1-2 Мб в формате JPEG кажется странным. Я не видел ваш код, но, возможно, вы открываете файл несколько раз для каждого экземпляра размера? Попробуйте открыть файл один раз, (измените его размер, сохраните его) X 4, затем закройте его.

В настоящее время у меня есть сайт, на котором пользователи загружают изображения и не сталкиваются с ошибкой, мои настройки составляют 16 МБ для сценариев PHP и предел загрузки файлов 2 МБ, и я использую эту библиотеку вместо груши

пример кода

$image
->open('uploaded.jpg')
->resize(500, 500)
->save('large.jpg')
->resize(100, 100)
->save('medium.jpg')
->resize(25, 25)
->save('small.jpg')
->close();
1 голос
/ 09 февраля 2009

Кажется, что ini_set ("memory_limit", "256M"); накрыл это. Кроме того, используя memory_get_peak_usage (), я обнаружил, что размер моего изображения (с проблемными jpgs) использовался в области 90 МБ для изображения 1,8 МБ.

Также представляет интерес http://uk.php.net/manual/en/function.imagecreatefromjpeg.php#64155 для способа динамического назначения предела памяти (который мне еще предстоит попробовать).

0 голосов
/ 12 января 2012

http://www.dotsamazing.com/en/labs/phpmemorylimit

Вот хороший инструмент для расчета необходимой вам памяти. Это работало отлично даже для моего ужасно неэффективного кодирования ..

В нем также есть несколько советов о том, как выделить больше памяти.

0 голосов
/ 06 января 2011

В библиотеке Image_Transform отсутствует важная оптимизация изменения размера, доступная в ImageMagick и libjpeg. Вы можете эффективно изменить размер JPEG во время загрузки, указав размер перед чтением, пример в этом ответе:

Эффективное изменение размера изображения JPEG в PHP

...