Автоматическое копирование сайта и базы на яндекс диск
Я не буду тут распространяться о важности бэкапов – вы и так наверняка все знаете об этом. Единственно, что отдельно замечу, что не стоит целиком и полностью полагаться на хостера – то есть на его бэкапы. Всякие могут быть форс-мажоры, иногда на многие часы и даже дни выходит все оборудование провайдера – так что не помешает настроить и свою систему автоматического сохранения нужных данных. Этот код по копированию сайта и заливке файлов на яндекс диск будет полезен как минимум владельцам небольших ресурсов – блогов, магазинчиков и т.д.
Итак, условно разобьем все на три этапа. Программирование можно сравнить с кубиками, так вот эти три этапа – это и есть наши кубики, из которых можно собрать программу.
1. Файлы на хостинге в архив
Для того, чтобы обойти все файлы на хостинге в нужной папке, мы возьмем вот такую функцию
function CustomZip($source, $destination)
{
if (!extension_loaded('zip') || !file_exists($source)) {
return false;
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
return false;
}
$source = str_replace('\\', '/', realpath($source));
if (is_dir($source) === true)
{
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
foreach ($files as $file)
{
$file = str_replace('\\', '/', $file);
// Игнорируем "." и ".." папки
if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
continue;
$file = realpath($file);
if (is_dir($file) === true)
{
$zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
}
else if (is_file($file) === true)
{
$zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
}
}
}
else if (is_file($source) === true)
{
$zip->addFromString(basename($source), file_get_contents($source));
}
return $zip->close();
}
Используем очень просто:
CustomZip($src_dir, $fileName);2. Дамп базы данных в архив
Так как очень часто у сайта имеется база данных, то и для неё необходимо создавать резервные копии периодически. Здесь есть два способа. Первый это использовать функцию shell_exec
shell_exec('mysqldump --user=root --password=pass --host=localhost name_bd | gzip > /var/www/html/'.$file);
тут мы сразу же сжимаем базу. Таким способом обычно можно создавать бэкапы даже на виртуальных (шаред) хостинга. Если не получается, то надо будет идти по другому пути – проходить по всем таблицам и копировать их с помощью PHP – это уже отдельная тема, в данном материале мы её разбирать не будем.
3. Заливка на яндекс диск
Перед тем, как непосредственно заливать, надо создать приложение
и дать доступ ему к вашему яндекс диску. Затем получить токен.
https://oauth.yandex.ru/authorize?response_type=token&client_id=идентификатор_приложенияИ уже зная токен несложно набросать код, заливающий копию вашего сайта на яндекс диск
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/resources/upload?path=' . urlencode($path . basename($file)));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
$res = json_decode($res, true);
if (empty($res['error'])) {
// Если ошибки нет, то отправляем файл на полученный URL.
$fp = fopen($file, 'r');
$ch = curl_init($res['href']);
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 201) {
echo 'Файл успешно загружен.';
}
}
else{
echo $res['error'];
}
Вот, собственно и все. Это основные блоки.
Что еще надо иметь в виду
- Во-первых, к папке, где вы собираетесь временно хранить файлы у процесса/пользователя выполняющего данные действия должны быть права на чтение и запись.
- Во-вторых, лучше вообще эти папки либо не будут доступны из веба, либо будут доступны, но иметь временный адрес и обязательно файлы удаляться после отправки.
- Также стоит иметь в виду, что заливаются архивы на яндекс диск не очень быстро – так что стоит возможно позаботиться о лимитах - как по памяти, так и по времени выполнения скриптов. И еще раз – их обязательно надо удалять, чтобы не были доступны извне.
- Еще в скрипте лучше использовать относительные пути или магическую константу __DIR__ - чтобы не искать корень.
- Также надо настроить запуск скрипта по крону в выбранное время и обеспечить невозможность запуска его в другое (например, по прямой ссылке)
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты