Динамический 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 комментарий