Динамический 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
Полезная штуковина)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.