Динамический backup файлов

CodeIgniter: Динамический backup файлов
Возможно кому то и пригодится динамический backup файлов, по времени последнего сканирования директории.

Данная функция полезна тем у кого очень большой объем файлов на сервере и не предстоит возможным скачивать весь сайт целиком к себе на ПК.

Я уже давно столкнулся с этой проблемой, размер сайта на тот момент составлял более 10GB и скачивать такой объем было просто невозможно, долго, да и совсем не нужно. Зачем качать одни и те же файлы, проще скачать то чего еще нет.



Собственно у меня было две версии реализации данной возможности, но вскоре остановился на одной, так как меньше ресурсов и меньше данных хранится на сервере о последнем сканировании директории.

Реализации очень простоя и всего скорее практически каждый поймет ее логику (тот кто работает с Codeigniter).

Ну а вот и сама логика:
1. Чтобы скачать новые файлы в первый раз, необходимо создать файл /backup/time.csv в него нужно записать UNIX время, например
1384884035

Выставьте на файл права 666
1384884035 — time() время с которого необходимо архивировать новые файлы.
2. Получив список новых файлов, архивируем их.
3. Обновляем файл time.csv прописав в него время последнего сканирования файлов.

Очень просто, не так ли?

Ну а теперь сама реализация.

   
public function backup($cell = array(), $data = array())
   
{
       
// Подгружаем хелперс для работы с директориями
        $this
->load->helper('file');

       
// Получаем время последнего сканирования
       
if( ! $time = implode('', file('./backup/time.csv')))
       
{
            echo
'Файл time.csv пуст или не найден.';
           
return false;
       
}

       
// Получаем список всех файлов из директории uploads
        $data
= get_dir_file_info('./uploads', FALSE);

       
// Отфильтровываем старые файлы по времени
       
foreach($data as $file)
       
{
           
if($file['date'] > $time)
           
{
               
// Новый массив с новыми файлами
                $cell
[] = $file;
           
}
       
}

       
// Отправляем данные на архивацию
       
if( ! $error =  $this->_backup($cell))
       
{
           
// Сообщим об ошибке если что то пойдет не так
           
die($error);
       
}
        echo
'Новые файлы запакованы.';
   
}
   
   
private function _archive_backup($data = array())
   
{
       
// Если новых файлов нет
       
if(empty($data))
       
{
            echo
'Нет новых файлов.';
           
return false;
       
}

       
// Подгружаем библиотеку по работе с архивами
        $this
->load->library('zip');

       
// Подготавливаем список файлов для архивации
       
foreach($data as $file)
       
{
           
// Список файлов из папки uploads
            $this
->zip->read_file($file['server_path'], TRUE);
       
}

       
// запаковываем файлы в архив
       
if( ! $this->zip->archive('./backup/new_backup.zip'))
       
{
            echo
'Ошибка при архивации. Архив не создан.';
           
return false;
       
}

       
// Записываем новое время в файл time.csv
       
if ( ! write_file('./backup/time.csv', time()))
       
{
             echo
'Невозможно записать данные в файл time.csv';
             
return false;
       
}
       
return true;
   
}

1 комментарий

avatar
Полезная штуковина)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.