php webdav yandex-disk
Бэкапы можно хранить на яндекс диске. Складируем их по протоколу webdav на php. Есть клиент под этот протокол. Качаем http://sabre.io/dav/install/
composer require sabre/dav ~3.2.0
Документация не самая полная, однако в коде куча комментов, так что без проблем разобраться. Нужен модуль php-dom.
use Sabre\DAV\Client;
include 'vendor/autoload.php';
$settings = array(
'baseUri' => 'https://webdav.yandex.ru',
'userName' => 'user',
'password' => 'pass123',
// 'proxy' => 'locahost:8888',
);
// должна лежать на уровень выше текущей папки
$LOCAL_back_folder = 'backups';
$YA_back_folder = 'my_backups';
$client = new Client($settings);
Для начала получим список директорий с бэкапами на ЯД, и удалим старые.
$response = $client->propfind(
$YA_back_folder, // dir
array(
'{DAV:}displayname',
'{DAV:}creationdate',
) , // props
1 // depth
);
function compareByTimeStamp($time1, $time2)
{
if (strtotime($time1) < strtotime($time2))
return 1;
else if (strtotime($time1) > strtotime($time2))
return -1;
else
return 0;
}
// убираю родит. дир-ю
array_shift($response);
$dates = array_column($response, '{DAV:}displayname');
usort($dates, "compareByTimeStamp");
$dates = array_reverse($dates);
//////////// DELETE OLD
// $method, $url = '', $body = null, array $headers = []
if(count($dates) > 7)
$response = $client->request('DELETE', "$YA_back_folder/".$dates[0] , null, array());
И закачаем новые файлы
$backup_date_arr = scandir( dirname(__DIR__) . "/$LOCAL_back_folder");
// избавляемся от родит. директорий
$backup_date = $backup_date_arr[2];
$backup_files = scandir(dirname(__DIR__) . "/$LOCAL_back_folder" . $backup_date);
unset($backup_files[0]);
unset($backup_files[1]);
$response = $client->request('MKCOL', "$YA_back_folder/". $backup_date , null);
foreach ($backup_files as $key => $backup_file) {
$file = fopen(dirname(__DIR__) ."/$LOCAL_back_folder/" . $backup_date . "/$backup_file", 'r');
$url = "$YA_back_folder/{$backup_date}/$backup_file";
// заменяем пробелы дабы не было 400 ошибки (Bad Message 400 reason: Unknown Version)
$url = str_replace ( ' ', '%20', $url);
$response = $client->request('PUT', $url, $file );
fclose($file);
}
Без клиента , на голом php и curl все выглядит примерно так
$url = "https://webdav.yandex.ru/$YA_back_folder";
$ch = curl_init($url);
// webdav метод
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PROPFIND');
// авторизация
curl_setopt($ch, CURLOPT_USERPWD, 'user:password');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// заголовки
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Depth:1', 'Content-Type:application/xml'));
$responce = curl_exec($ch);
curl_close($ch);
//print_r($responce);
Leave a comment