Ограничение памяти PHP - PullRequest
       9

Ограничение памяти PHP

3 голосов
/ 25 сентября 2010

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

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

У меня есть сценарий загрузки изображений, который я пишу, использующий довольно симпатичныйклассный PHP-скрипт с названием simpleImage, который можно найти здесь: http://www.white -hat-web-design.co.uk / Articles / php-image-resizing.php

У меня есть основныеформа, которая принимает JPG и PNG.Я установил свой предел памяти PHP на 24 м, думая, что это будет достаточно высоко, но когда я попытался загрузить 3-мегабайтное изображение, я все равно получил красивую исчерпанную ошибку выделения памяти.Повышение значения до 240M и сценарий работает нормально (локально).

Мой сценарий делает это:1) Принимает загруженное изображение TMP2) Запускает getimagesize () на изображении, чтобы убедиться, что это действительное изображение.3) Перемещает временное изображение в конечный каталог назначения.4) Загружает изображение, используя простое изображение.5) Изменение размера изображения с помощью простого изображения.6) Сохраняет изображение с измененным размером, используя простой скрипт изображения.

Так что я предполагаю, что вся загрузка / проверка / изменение размера требует чуть больше, чем 24M.Но я беспокоюсь о том, каким будет приемлемое ограничение памяти.Я хотел бы, чтобы пользователи могли загружать изображения размером ~ 6 МБ.Это будет чрезвычайно напряженно на ваших средних выделенных серверах?

Вот суть моего сценария ... лично я не думаю, что он чрезмерно расточителен для ресурсов ??

    if (!empty($_FILES)) {
    // get image
    ini_set("memory_limit","24M");
    require_once('simpleImage.php');
    require_once('db.php');
    $tempFile             =     $_FILES['file']['tmp_name'];
    $originalFile        =    $_FILES['file']['name'];
    $extension             =     strtolower(end(explode(".", $originalFile)));
    $targetFile         =    "path/to/directory/";

    // validate image
    $validExtensions    =    array('jpg', 'jpeg', 'png');
    if(in_array($extension, $validExtensions)) {
        $validExtension        =    true;    
    } else {
        $validExtension        =    false;    
    }

    if(getimagesize($tempFile) == false) {
        $validImage        =    false;    
    } else {
        $validImage        =    true;    
    }


    if($validExtension == true && $validImage == true) {
        if(move_uploaded_file($tempFile,$targetFile)) {

            $image = new SimpleImage();
            $image->load($targetFile);
            $image->resizeToWidth(500);
            $image->save($targetFile);
        }
    } 
}

Ответы [ 4 ]

3 голосов
/ 25 сентября 2010

Форматы, такие как JPG и PNG, сильно сжаты и, следовательно, файл размером 3 МБ, который, скажем, 6 мегапикселей, может легко расшириться до 24 МБ в памяти. Добавление в выходное изображение и собственных требований PHP может легко сделать использование памяти более 30 МБ.

Фактическая потребность в памяти больше зависит от размеров изображения, а не от размера файла. Приблизительная оценка будет megapixels * 3 МБ для изображений RGB (JPEG и непрозрачные PNG) или megapixels * 4 МБ для изображений RGBA (прозрачные PNG). Не забывайте, что сама библиотека GD может поддерживать временные внутренние буферы для различных целей, поэтому удвоение этой оценки должно быть разумным ограничением использования памяти.

2 голосов
/ 25 сентября 2010

Ваш средний сервер, безусловно, может обработать несколько загрузок файлов по 6мег.Несомненно, большинство пользователей будут использовать широкополосный DSL или кабельный широкополосный доступ, который имеет довольно низкую пропускную способность.40-60kbyte / сек.Большинство серверов будут иметь как минимум быструю Ethernet-связь (100 Мбит), которая теоретически может обрабатывать около 200 одновременных загрузок со скоростью 60 Кбит / с.

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

Хорошее правилоБольшой палец должен иметь как минимум на 1 мегабайт больше, чем самый большой файл, который вы хотите загрузить.Если ваш код ужасно раздут, это должно обрабатывать большинство сценариев, которые вы хотите использовать для обработки загрузки, и из этого вы можете увеличить лимит для обработки накладных расходов на изменение размера изображения.Но фактическое пространство памяти для загрузки должно быть установлено в конфигурации сервера (директивы Apache php_value) или PHP-файле php.ini - к тому времени, когда ваш скрипт будет выполнен и выполнит ini_set('memory_limit', ...), загрузка уже завершена (или прервана).из-за недостатка памяти).

2 голосов
/ 25 сентября 2010

Скорее всего, предел вашей памяти слишком мал.

Имейте в виду, что при редактировании файлов изображений их, как правило, необходимо хранить в памяти без сжатия.Таким образом, хотя размер 3000x3000 jpeg может быть меньше 3 МБ, без сжатия он будет равен 3000x3000x3 (3 для одного байта для RGB) или 27 МБ, а при наличии альфа-канала - 36 МБ.Кроме того, по окончании работы с ресурсом изображения обязательно уничтожьте его, чтобы ресурсы могли быть освобождены.

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

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

SimpleImage, вероятно, не очень эффективно.Де-факто стандартом для манипулирования изображениями внутри программ является ImageMagick .Он написан на C и поэтому очень эффективен.Это также широко используется и хорошо проверено.См. эту страницу на php.net для инструкций по установке и использованию в PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...