2009-02-09 5 views
0

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

Я использую Pear Image_Transform, но я продолжал получать «байт исчерпал» фатальные ошибки на некоторых типах jpg (все файлы, которые пытались использовать под 2 МБ). Поэтому я перешел на выделенный сервер с Pentium Dual-Core E5200 @ 2.50GHz и 2GB RAM. Загрузил тот же код изменения размера изображения - та же ошибка. Я поднял RAM в php.ini до 64M, но сайт получил ту же проблему на некоторых типах jpg. Также попробовал класс wideimage - такая же ошибка (ошибка всегда с imagecreatefromjpeg()). (Использование GD2). Все работает отлично на моем Mac.

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

ответ

1

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

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

1

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

Я в настоящее время сайт, где пользователи загружать изображения, а не работает в ошибку, мои настройки 16Mb для PHP скриптов и 2Mb предел загрузки файлов и я использую this library вместо груши

пример кода

$image 
->open('uploaded.jpg') 
->resize(500, 500) 
->save('large.jpg') 
->resize(100, 100) 
->save('medium.jpg') 
->resize(25, 25) 
->save('small.jpg') 
->close(); 
+0

Я побежал ваш класс/код с теми же результатами использования памяти. Использование памяти на 85 Мб для jpg в 1,8 Мб. Я думаю, это зависит от типа загруженного jpg. После поиска в форумах это не кажется необычным. – ed209

+0

А, хорошо знать. Вы не хотите загружать jpg-файл? Любопытно по этому поведению. – Mario

+0

напишите мне здесь, и я отвечу на соответствующий вопрос jpg - интересно узнать, что вы найдете [email protected] (истекает через 1 час) – ed209

2

грубое руководство о том, сколько памяти вы будете нуждаться можно вычислить, как этот

$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; 

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

0

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

Efficient JPEG Image Resizing in PHP

0

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

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

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

1

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

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

См CLI преобразовать команду:

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

Смежные вопросы