нужна помощь в понимании управления памятью для этой функции PHP - PullRequest
0 голосов
/ 25 ноября 2010

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

* * 1004 -hat-web-design.co.uk / Статьи / PHP-изображения * resizing.php 1005 ** * 1006

вышеупомянутый класс работал только для изображений с низким разрешением, так как я хотел загружать изображения с высоким разрешением (4400px X 3500px) и затем обрезать его до фиксированного размера, я использовал нижеприведенную функцию php для увеличения размера памяти

ini_set ( "memory_limit", "100M");  

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

Я использую следующий код для изменения размера.

ini_set ( "memory_limit", "100M"); 
$image = new SimpleImage();
$image->load("$targetFile");
$image->resize(940,650);
$image->save("$targetFile");

Буду признателен, если кто-нибудь объяснит мне, если я поступаю неправильно, или это нормально?

спасибо

Ответы [ 3 ]

1 голос
/ 25 ноября 2010

Недостатком является то, что, конечно, страница PHP может потреблять 100 мегабайт памяти для обработки запроса - если это часто используемая страница, или существует риск многократного обращения к этой странице за раз, возможно, что производительность сервера может быть скомпрометирована (поскольку 10 запросов к коду, выполняющемуся одновременно, будут занимать 1 ГБ памяти)

Использование ini_set вместо изменения этого значения в другом месте в php.ini или в конфигурации веб-сервера (напримерфайлы .htaccess) означает, что область действия сценариев, потребляющих память, вероятно, меньше - сценарии должны сначала явно запросить использование дополнительной памяти.

На самом деле лучшего способа сделать это, чем до сих пор в PHP- для повышения производительности вы можете рассмотреть возможность использования ImageMagick для изменения размера изображения.

0 голосов
/ 25 ноября 2010

На самом деле вы делаете это неправильно ... init_set() не может установить memory_limit, используя сокращенную запись (100M), вместо этого вы должны использовать целочисленные значения (в байтах). Пожалуйста, смотрите здесь .

Итак, вы должны использовать

ini_set ( "memory_limit", 100*1024*1024); 

вместо.

EDIT

Забудь, что я написал выше. Даже если это указано в руководстве по PHP, это не относится к последним версиям PHP. Я попробовал это с PHP 5.3.3 на Mac OS X, и это работает даже с сокращенной нотацией. Спасибо обоим, кто указал на это.

0 голосов
/ 25 ноября 2010

Некоторые объяснения того, почему класс использует так много памяти:

Метод $ image-> load () в используемом классе вызывает imagecreatefromjpeg () / imagecreatefromgif () / imagecreatefrompng () (в зависимости от формата исходного файла) и загружает изображение в память.Насколько я понимаю, библиотека GD хранит изображения в растровом формате, находясь в памяти, которые, очевидно, намного больше, чем сжатый файл, который вы загрузили с диска.Вы можете рассчитать объем памяти, необходимый с помощью уравнения:

ширина изображения * высота изображения * глубина цвета / бит на байт

В приведенном выше примере это:

4400 *3500* 24/8 = 46,2 МБ (примерно)

И это только для загрузки исходного изображения, оно становится хуже !: p

Чтобы выполнить изменение размера, класс создает чистое полноцветное изображение с новыми размерами, а затем повторно помещает исходное изображение в памяти в новое.Это означает, что в момент выполнения скрипта у вас есть два растровых изображения, которые хранятся в памяти.Умножьте это на число одновременных пользователей, запускающих скрипт, и добавьте накладные расходы на все остальные ваши PHP-вещи, и вы обнаружите, что, вероятно, используете много памяти!

См. Эту ветку для некоторых примеров:http://www.webdeveloper.com/forum/showthread.php?t=182328

...