Столкнувшись с тем, что на моём сервере начало заканчиваться место на жёстком диске (оно ограничено 10Гб), в основном из-за того, что там лежали backup (7гб). Пришлось искать выход и он нашёлся. Использование WebDAV может спасти во многих ситуациях, и в конкретном случае для меня явился идеальным вариантом. Я использовал Яндекс.Диск как хранилище моих резервных копий. Ниже приведены примеры использования с исходными кодами.

Не так давно Яндекс аннонсировал и запустил новый сервис — Яндекс.Диск (регистрируясь по этой ссылке вы получите дополнительно 1ГБ к своему хранилищу).

При поиске решения проблемы выгрузки было найдено несколько вариантов.

Были рассмотрены:

  • Dropbox API — не хотел опробовать в действии, так как данный API требует oauth, с которым было лень заморачиваться, плюс не так много места дают.
  • Box API — места аж целых 50гб, но ограничение на размер файла в 100мб имхо неудобно.
  • Яндекс.Диск API — поддерживается не только oauth авторизация, но и basic авторизация, что сильно упростило мне жизнь.

Остановимся на Яндекс API.

Сначала был рассмотрен в качестве основы SabreDAV 1.6.2, но по непонятным для меня причинам он при загрузке файлов на Яндекс.Диск вёл себя странно — при отправке файла любого размера на Яндекс.Диске появлялся загруженный файл с размером 0 байт. Почему, как, по какой причине — не было желания разбирать.

Наконец-то нашёл отличный вариант:

WebDAV Client на PHP.

Для корректной его работы с Яндекс.Диском, если вы используете старую версию скрипта или у вас что-то не аплоадится рекомендую применить патч.

Патч, позволяющий WebDAV Client 1.0 корректно работать с Яндекс.Диск. Данный патч исправляет ошибку, из-за которой было не возможно получить список файлов с Яндекс Диска. Так же патч исправляет ошибку, которая вызывала зависание PHP скрипта при получении данных от Яндекс Диска (при вызове функций get() и get_file() ). Скачать патч.

WebDAV client implements a WebDAV protocol client that is nearly conformant to RFC 2518 to modify resources on a HTTP server.
It supports operations GET, PUT, MOVE, COPY, etc., either using HTTP/1.0 and HTTP/1.1.
Пример использования — создаёт файл архива, создаёт на **Яндекс Диск** папку (директорию) backup и загружает в неё созданный файл архива:
// Создаём архив
$backupFileName="Backup.".date("c").".zip";

$archive = new PclZip($backupFileName);
$v_list = $archive->create('../');
if ($v_list == 0) {
    die("Error : " . $archive->errorInfo(true));
}

unlink($fileName);

// Начинаем выгружать файл архива на Яндекс Диск

error_reporting(0);

if (!class_exists('webdav_client')) {
 require('./class_webdav_client.php');
} 

$wdc = new webdav_client();
$wdc->set_server('ssl://webdav.yandex.ru');
$wdc->set_port(443);
// Логин
$wdc->set_user('yandex_login');
// Пароль
$wdc->set_pass('yande_pass');
// use HTTP/1.1
$wdc->set_protocol(1);
// enable debugging
$wdc->set_debug(false);

if (!$wdc->open()) {
  print 'Error: could not open server connection';
  exit;
}

// check if server supports webdav rfc 2518
if (!$wdc->check_webdav()) {
  print 'Error: server does not support webdav or user/password may be wrong';
  exit;
}
// Создадим папку backup
$http_status  = $wdc->mkcol("/backup");
// Выгружаем файл
$http_status = $wdc->put_file("/backup/".$backupFileName, $backupFileName);
print 'webdav server returns ' . $http_status . '
';

$wdc->close();
flush();
Так же для того, чтобы данный пример работал, нужно подключить модуль php_openssl.dll в php.ini
В моём случае логика работы скрипта немного отличается от примера.
1) Запуск скрипта идёт по крону раз в сутки
2) Скрипт делает дамп всех mysql баз
3) Скрипт кладёт дамп и файлы сайтов в архив (почти как в примере)
4) Подключаюсь к Яндекс.Диск и проверяю сколько места осталось там
5) Сравниваю сколько места на Яндекс.Диск и размер файла бекапа, если файл больше чем места получаю массив списка файлов
6) В этом массиве ищу самый старый файл и удаляю его
7) Загружаю новый бекап
8) Отключаюсь от сервера и шлю себе на почту инфу с логом того как прошла выгрузка.
Вот как-то так это работает.

Комментарии

comments powered by Disqus