За последние 24 часа нас посетили 22636 программистов и 1588 роботов. Сейчас ищут 860 программистов ...

Заканчивается память на сервере (после уменьшения картинок)

Тема в разделе "Прочие вопросы по PHP", создана пользователем Slicer, 2 июл 2009.

  1. Slicer

    Slicer Активный пользователь

    С нами с:
    10 фев 2009
    Сообщения:
    28
    Симпатии:
    0
    Столкнулся с такой проблемой, каждый день на серваке происходит утечка памяти (всего 4 ГБ), подозрение пало на скрипт по уменьшению картинок (все превьюшки формирует на лету). Решил переделать сайт, чтоб не обрабатывать каждый раз картинку, сохранить все превью в файл. После выполнения скрипта по уменьшению всех картинок на сервере снова закончилась память (картинок около 5000, в среднем по 50 Кб).
    Что это может быть? Кривой скрипт или криво настроен сервер?

    Код функции которая уменьшает картинку и сохраняет в файл:

    PHP:
    1. <?
    2. function resize_image($filename, $dest_file, $width_limit, $height_limit, $fixed_asp=0) {
    3.    $image_src = @ImageCreateFromJpeg($filename);
    4.    if ($image_src==false) $image_src = @imagecreatefrompng($filename);
    5.    if ($image_src==false) $image_src = @imagecreatefromgif($filename);
    6.    if ($image_src==false) return false;
    7.    //$width_limit=$preview_image_width; $height_limit=$preview_image_height;
    8.    list($src_width, $src_height) = getimagesize($filename);
    9.    $img_asp = $src_width / $src_height;
    10.  
    11.    // обрезаем изображение
    12.    if ($fixed_asp!=0) {
    13.       if ($img_asp > $fixed_asp) {// зашкал по ширине
    14.          $image_dest = imagecreatetruecolor($src_height*$fixed_asp, $src_height);
    15.          $side_crop = ($src_width - $src_height*$fixed_asp) / 2;  // кол-во пикселей для обрезки по сторонам
    16.          imagecopyresampled($image_dest, $image_src, 0, 0, $side_crop, 0, $src_height*$fixed_asp, $src_height, $src_height*$fixed_asp, $src_height);
    17.          $src_width = $src_height*$fixed_asp; // для дальнейшего использования
    18.       }
    19.       else {// зашкал по высоте
    20.          $image_dest = imagecreatetruecolor($src_width, $src_width / $fixed_asp);
    21.          $side_crop = ($src_height - $src_width / $fixed_asp) / 2;  // кол-во пикселей для обрезки сверху
    22.          imagecopyresampled($image_dest, $image_src, 0, 0, 0, $side_crop, $src_width, $src_width/$fixed_asp, $src_width, $src_width/$fixed_asp);
    23.          $src_height = $src_width / $fixed_asp; // для дальнейшего использования
    24.       }
    25.       $image_src = $image_dest;
    26.       $img_asp = $src_width / $src_height;
    27.    }
    28.  
    29.    // подгоняем под границы
    30.    $img_asp = $src_width / $src_height;
    31.    $lim_asp = $width_limit / $height_limit;
    32.  
    33.    if ($img_asp >= $lim_asp && $src_width>$width_limit) {       // если зашкаливает ширина
    34.        $new_width = $width_limit;
    35.        $new_height = $src_height * $new_width / $src_width;
    36.    }
    37.    else if ($img_asp < $lim_asp && $src_height>$height_limit) { // если зашкаливает высота
    38.       $new_height = $height_limit;
    39.       $new_width = $src_width * $new_height / $src_height;
    40.    }
    41.    else {                                                       // если ничего не зашкаливает
    42.       $new_width = $src_width;
    43.       $new_height = $src_height;
    44.    }
    45.  
    46.    $image_dest = imagecreatetruecolor($new_width, $new_height);
    47.    imagecopyresampled($image_dest, $image_src, 0, 0, 0, 0, $new_width, $new_height, $src_width, $src_height) or die ("Image resize failed");
    48.    ImageJpeg($image_dest,$dest_file,80) or die("Cannot output image to file");
    49.  
    50.    // чистим память
    51.    imagedestroy($image_src);
    52.    imagedestroy($image_dest);
    53.    return true;
    54. }?>
    55.  
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    поподробнее. почему так решил?

    ОС какая? вебсервер и т.д.
     
  3. Slicer

    Slicer Активный пользователь

    С нами с:
    10 фев 2009
    Сообщения:
    28
    Симпатии:
    0
    Server: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny3 with Suhosin-Patch

    И всё таки не в картинках дело было...
    После отключения статистики (Spesta) утечка памяти прекратилась (см график), но позже (около 4 часов ночи) произошел резкий скачек в кэше (где-то на 1 Гб!) и такие скачки периодически наблюдаются.
    В чем может быть причина? Криво написаны скрипты?
    [​IMG]