Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Чистка директории по времени и значению из базы


Автор: Jops 5.3.2013, 13:06
Здравствуйте уважаемые!
Помогите с решением или может, кто уже делал что-то подобное.
Есть директория вида /vlc/ready/, внутри которой идёт формирование:
/vlc/ready/cam1/03-03-2013 (сколь угодно большое кол-во папок)/…
/vlc/ready/cam2/01-03-2013 (по аналогии)/…
и т.д.
/vlc/ready/название камеры/дата создания архива записей/сами записи
Есть данные в базе вида: cam1 (название папки в директории /vlc/ready/); 10 или любое другое число (через это количество дней, начиная с момента создания папки 00-00-0000, удалить её).
Выборка типа: SELECT cam_alias, delete_dir FROM cam_list и выдаёт «массив» значений
И всё действие в следующем: Берём из базы название камеры (соответственно папки) и число (кол-во дней); прёмся в директорию и смотрим «А не устарели ли папки в cam1, например?». Если устарели, удаляем, если нет, то идём в cam2 и т.д.
Сам скрипт будет запускаться в cron.
Может, кто ваял уже что-то подобное или просто очертить, как правильно сделать. Вроде бы и ни чего такого сложного, но не идёт и всё в мозг нужные действия. Выборка, получение, а как с числом и папками разобраться, ну ни как.
Благодарю всех, кто потратит своё время на данный вопрос
P.S.: Имеется ли на PHP модуль или что либо подобное, для подкраски выводимых действий в консоли? Аля PERL

Автор: Aliance 5.3.2013, 13:19
Хотелось бы видеть еще дамп таблицы, наверное, потому что не понятно зачем здесь
Цитата(Jops @  5.3.2013,  14:06 Найти цитируемый пост)
Берём из базы название камеры (соответственно папки) и число (кол-во дней)

число дней, а не timestamp.

Имеется ввиду, что в БД хранится кол-во дней, которое должна хранится камера? Тогда там, берем текущую дату и для каждой камеры отнимаем из нее N дней, указанных в БД (например, гуглим по DateDiff). Получаем массив дат вида camera => date. Далее, бежим по директориям и по датам, проверяем - если нужно удаляем, примерно так:
Код

$sqlResult = array(
    'cam1' => '59',
    'cam2' => '28',
    'cam3' => '3',
);

$now = '2013-03-05';
...
// прогоняем в цикле DateDiff и получаем массив примерно такого вида:
...
$dateDiffs = array(
    'cam1' => '2013-01-01',
    'cam2' => '2013-02-05',
    'cam3' => '2013-03-02',
);
...
// 
...
foreach ($dirs as $cam) {
    foreach ($cam as $date) {
        // тут сравниваем даты
        if ($date < $dateDiffs[ $cam ]) {
            rmdir( realpath('/vlc/ready/'.$cam.'/'.$date) );
        }
    }
}


Это псевдокод, сама реализация за тобой.

Автор: Jops 5.3.2013, 13:45
Цитата(Aliance @  5.3.2013,  13:19 Найти цитируемый пост)
число дней, а не timestamp.

Да именно кол-во дней. Тоесть 1 или 5 или 10 или 100 и.д.
Цитата(Aliance @  5.3.2013,  13:19 Найти цитируемый пост)
Хотелось бы видеть еще дамп таблицы, наверное, потому что не понятно зачем здесь

Название камеры берётся для того что бы инициировать (найти) нужную папку в директории /vlc/ready/. Кол-во папок можеть быть много. Они вида: cam1, cam12, cam33 или например aaa88. А уже в ней нужно удалить папку(и) вида 00-00-0000 через соответствующее кол-во дней, выбранных тоже из бызы. И в итоге: Для каждой папки cam... своё кол-во дней.


Цитата(Aliance @  5.3.2013,  13:19 Найти цитируемый пост)
Имеется ввиду, что в БД хранится кол-во дней, которое должна хранится камера? Тогда там, берем текущую дату и для каждой камеры отнимаем из нее N дней, указанных в БД (например, гуглим по DateDiff). Получаем массив дат вида camera => date. Далее, бежим по директориям и по датам, проверяем - если нужно удаляем, примерно так:

Не совсем. В БД хранится кол-во дней, которое должны хранится папки с записями в cam...

Автор: Aliance 5.3.2013, 14:31
Я написал псевдокод, чем он не устраивает? Из написанного в новом посту ничего не меняет сути.

Автор: Jops 5.3.2013, 15:17
Я понял, спасибо. Просто уточнил)

Автор: Jops 11.3.2013, 04:45
Наконец то добрался до написания

Код

define('DB_HOST', '109.126.0.94');
    define('DB_LOGIN', 'cams');
    define('DB_PASSWORD', 'cams');
    define('DB_NAME', 'cams');

    
    echo "Подключение к БД...";
        $link = mysql_connect(DB_HOST, DB_LOGIN, DB_PASSWORD)
        or die ('Ошибка подключения:'. mysqli_connect_error() ."\n");
    echo "Done. \n";
    
    mysql_select_db(DB_NAME)
        or die("БД не найдена \n");
    
    echo "Считывание данных из БД...";
        $sql = "SELECT cam_alias, delete_dir FROM cams_list";
        $result = mysql_query($sql) 
        or die('Не удалось выполнить запрос!' . mysql_error() ."\n");
    echo "Done. \n";
    
    
    if (mysql_num_rows($result) > 0) {
        $array = array();
    while ($row = mysql_fetch_assoc($result)) {    
        $array[$row['cam_alias']] = $row['delete_dir'];
    }
    } else {
        echo "Данные в таблице `cams_list` отсутствуют \n";
    }
    

    $date_now = date('d-m-Y');
    echo 'Текущая дата: '.$date_now."\n";
    $array_time = array();
    foreach($array as $key => $value)
  {
        $timestamp = time();
        $date_time_array = getdate($timestamp);

        $hours = $date_time_array['hours'];
        $minutes = $date_time_array['minutes'];
        $seconds = $date_time_array['seconds'];
        $month = $date_time_array['mon'];
        $day = $date_time_array['mday'];
        $year = $date_time_array['year'];


        $timestamp = mktime($hours,$minutes,$seconds,$month,$day + $value,$year);

        $array_time[$key] = strftime('%d-%m-%Y',$timestamp);


  } 


В конечном итоге в консоле посредствам цикла foreach вывожу данные (для проверки) вида:

cam1 = 14-03-2013 
cam2 = 26-03-2013 
cam3 = 12-04-2013 
cam4 = 09-06-2013 
china = 09-06-2013 
cam6 = 09-06-2013 
cam7 = 09-06-2013 
cam8 = 06-05-2013 
cam9 = 09-06-2013 
cam10 = 09-06-2013 

Всё корректно меняется (прибавление количества дней до удаления).
А вот как дальше присобачить к вашей конструкции мой массив $array_time с данными, я как то не очень понимаю. Объясните?

И ещё. rmdir ведь удаляет директорию, если она пустая. А она соответственно не пустая и предварительно надо удалить из неё все файлы. Разъясните пожалуйста, а то времени уже в обрез) Дотянул так сказать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)