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

Не так давно Яндекс аннонсировал и запустил новый сервис — Зарегистрироваться на Яндекс.Диск и получить дополнительный 1ГБ места (регистрируясь по этой ссылке вы получите дополнительно 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. Отключаюсь от сервера и шлю себе на почту инфу с логом того как прошла выгрузка.

Вот как-то так это работает.

Комментарии