php webdav yandex-disk

Бэкапы можно хранить на яндекс диске. Складируем их по протоколу webdav на php. Есть клиент под этот протокол. Качаем http://sabre.io/dav/install/


composer require sabre/dav ~3.2.0

Документация не самая полная, однако в коде куча комментов, так что без проблем разобраться.


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 = []
$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 );
}

Без клиента , на голом 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

Your email address will not be published.


*