Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрипт по уменьшению тумбов, Нагрузка на сервер  
:(
    Опции темы
gvoksel
Дата 10.8.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.7.2010
Где: Питер

Репутация: нет
Всего: нет



Всем привет.

Прошу откликнуться знатоков.

Есть большущий объем тумбов (преъевью картинок) на сервере, порядка 500Гб.
Сейчас размер их не устраивает. Написал скрипт который обходит папки и работает с картинками из папок thumbs.

Сам скрипт работает нормально.
Прошу дать советы как не повесить моим скриптом сервер.
Использую в данный момент sleep, но может лучше повесить на крон?
Так же рад любой помощи в оптимизации кода, да бы ускорить процесс обработки тумбов.


Код

$start_dir = "F:/www/site.ru/htdocs/upload/photos/posts/"; //полный путь к корневой папке с фоткамми

$w_th = 200; //новая длина тумбы
$h_th = 150; //новая высота тумбы

$cnt_sleep = 10; //после какого числа элементов делать задержку
$time_sleep = 10; //на сколько делать задержку

/*********************************************************/
$ratio = $w_th / $h_th; //определяем коэффициент сжатия изображения
$total = 0; //кол-во обработанных тумбов
$none = 0;  //кол-во не обработанных тумбов

class ImageFilter extends FilterIterator {
    public function accept () {
        return preg_match('@\.(gif|jpe?g|png)$@i', $this->current());
    }
}

$dir = (new RecursiveDirectoryIterator($start_dir));

foreach (new ImageFilter(new RecursiveIteratorIterator($dir)) as $file) {

    if(preg_match("/thumbs/i", $file->getPath())) {
        $result = Resizefile($file->getPathname());
        
        if($result) $total++;
        else $none++; 
    }
}

function Resizefile($file_path) {
    global $ratio, $w_th, $h_th;
    
    list($width, $height, $mime) = getimagesize($file_path);
    
    if(($width <= $w_th) && ($height <= $h_th))
        return false;
        
    $src_ratio = $width / $height;
    
    if($ratio < $src_ratio) $h_th = $w_th/$src_ratio;  
    else $w_th = $h_th*$src_ratio;
    
    $clear_img = imagecreatetruecolor($w_th, $h_th);
    
    if($mime == 1) 
        $src_img = imagecreatefromgif($file_path);
    elseif($mime == 2)
        $src_img = imagecreatefromjpeg($file_path);
    elseif($mime == 3)
        $src_img = imagecreatefrompng($file_path);
    else 
        return false;
        
    imagecopyresampled($clear_img, $src_img, 0, 0, 0, 0, $w_th, $h_th, $width, $height);
    
    unlink($file_path);
    
    if($mime == 1) 
        imagegif($clear_img, $file_path);
    elseif($mime == 2) 
        imagejpeg($clear_img, $file_path); 
    elseif($mime == 3)
        imagepng($clear_img, $file_path);
        
    imagedestroy($clear_img);
    imagedestroy($src_img);
    
    return true;          
}

echo "Кол-во обработанных тумбов : {$total}, не обработанных {$none}";


Это сообщение отредактировал(а) gvoksel - 10.8.2010, 21:22
PM MAIL ICQ   Вверх
bars80080
Дата 10.8.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



а разве, это не разовая работа?
выполняешь по этапно в несколько приёмов и всё. зачем тут крон? можешь и вручную несколько раз запустить
PM MAIL WWW   Вверх
gvoksel
Дата 11.8.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.7.2010
Где: Питер

Репутация: нет
Всего: нет



Боюсь сервак повесить. Хотя оригинал тумбов не сильно большой.

Что понимаешь под словами поэтапно? 
PM MAIL ICQ   Вверх
gvoksel
Дата 11.8.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.7.2010
Где: Питер

Репутация: нет
Всего: нет



Написал обычную рекурсию по каталогу

Результаты следующие: 

на рекурсии 10000 файлов - Скрипт отработал за 141.309851 секунд
на итераторе 10000 файлов - Скрипт отработал за 151.990946 секунд


как бы узнать повешу ли я своим скриптом сервак  smile 
на моем компе =) четырех ядерка правда - ни капли подвисалок + set_timelimit (0)



Это сообщение отредактировал(а) gvoksel - 11.8.2010, 14:33
PM MAIL ICQ   Вверх
IgorIV
Дата 11.8.2010, 16:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: нет
Всего: 8



Я бы удалил всё с концами, а новые генерил бы по требованию и сохранял бы.
500 ГБ, это при условии что средняя тумба не более 10 кб. Ужас....
PM MAIL   Вверх
gvoksel
Дата 11.8.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.7.2010
Где: Питер

Репутация: нет
Всего: нет



Цитата(IgorIV @  11.8.2010,  14:25 Найти цитируемый пост)
Я бы удалил всё с концами, а новые генерил бы по требованию и сохранял бы.

Так не получится. сейчас все тумбы задействованы. Если все удалить. Считай каталог с фотами слетит..так что не выход это(
PM MAIL ICQ   Вверх
IgorIV
Дата 11.8.2010, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: нет
Всего: 8



Они же задействованны не одновременно же?
Картинки отдаются nginx?
Если да, то примерно так 
Код


        location / {
             index index.php;

             open_file_cache_errors  off;
             error_page              404 = /fetch$uri;
             
             expires max;
        }

        location /fetch/ {
            internal;
            
            proxy_pass              http://*:8080/;
            proxy_store             on;
            proxy_store_access      user:rw  group:rw  all:r;
            proxy_temp_path         /usr/local/www/apache22/data/***/temp;
                          }

Но если не нравится этот вариант, тогда свой скрипт запускай ночью со слипом секунд в 10.

--

Что-то я прикинул так, 500гб/15кб~30млн тумб 
на 10т уходит по 150 секунд, тогда на 30 млн уйдет 138 часов. Что-то мало верится что столько скрипт отработает без сбоев.
Либо мой вариант, либо в крон пихать.
PM MAIL   Вверх
gvoksel
Дата 11.8.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.7.2010
Где: Питер

Репутация: нет
Всего: нет



IgorIV, спасибо.

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

структура такая

корневая папка
   - год-месяц
       - тумбы
   - год-месяц
       - тумбы

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

PM MAIL ICQ   Вверх
ksnk
Дата 11.8.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



Цитата(gvoksel @  11.8.2010,  23:23 Найти цитируемый пост)
как бы так изловчится...

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
capitan
Дата 12.8.2010, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 1
Всего: 13



Да уж. А потом окажется что такие размеры тоже не устроят.  Может все таки пойти другим путем?
1. Тумбы выводить в див нужного размера бэгграундом.
2. Если получится можно указать размеры тумбов прямо у тегов.
3. Перезаписывать тумбы по мере обращения.
4. Переубедить начальство что это самые оптимальные размеры для тумбов.
5. Не бояться начальства и высказывать свою точку зрения.

Программист должен предвидеть все ситуации. Вы даете голову на отсечение, что эти размеры окончательные и не будут пересмотрены?

Это сообщение отредактировал(а) capitan - 12.8.2010, 11:37
PM MAIL WWW ICQ   Вверх
gvoksel
Дата 12.8.2010, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.7.2010
Где: Питер

Репутация: нет
Всего: нет



ksnk,  спасибо уже почти сделал.


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

Сейчас как раз токи реализовано, что картинка выводится в меньшем масштабе, чтобы подгонялось по пда версию. 
После работы скрипта вес тумбом страниц должен уменьшится почти в половину ~ с 13кб до 6кб на одну тумбу.

А то что касается окончательных размеров, думаю они все таки окончательные smile 
PM MAIL ICQ   Вверх
IgorIV
Дата 12.8.2010, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: нет
Всего: 8



Цитата(gvoksel @  12.8.2010,  14:04 Найти цитируемый пост)
А то что касается окончательных размеров, думаю они все таки окончательные

Это по воде вилами ...
Цитата(gvoksel @  12.8.2010,  14:04 Найти цитируемый пост)
Выросло большое кол-во пользователей с мобильников

А вот это интересно, поделиться можешь или коммерческая тайна?
PM MAIL   Вверх
MuToGeN
Дата 17.8.2010, 00:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 4
Всего: 32



В нескольких последних проектах, подразумевающих перманентный процесс, создающий критичную нагрузку, проверял load average. Т.е., к примеру, лимит кол-ва процессов проксичекера = const / текущая нагрузка, пересчитывался раз в 10 секунд. Ну или интервал для sleep в вашем случае.
А вообще, насколько понял, задача не требует запуска в контексте веб-сервера, посему лучше запускать с минимальным приоритетом (nice) в CLI-контексте.


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
SneG0K
Дата 29.8.2010, 11:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: нет
Всего: 54



А генерировать thumb по требованию не? Я не думаю, что пользователь сильно расстроиться, если прождет загрузку страницы на две секунды дольше.

Если такой вариант не подходит, то сделай у себя, а потом просто залей.

Ну или ночью подключай тогда.
PM WWW Skype   Вверх
IZ@TOP
Дата 18.9.2010, 23:06 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Ну вы проблему придумали. Подвесить сервер... 
Пишешь шелл скрипт, который обходит твои каталоги и конвертом имиджмейджика делает то, что тебе нужно.
Проверено на полуторатерробайтных серверах забитых 1-10мб картинками.
А вообще - генерация по требованию: наш выбор.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0938 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.