Автоматическое копирование сайта и базы на яндекс диск
Я не буду тут распространяться о важности бэкапов – вы и так наверняка все знаете об этом. Единственно, что отдельно замечу, что не стоит целиком и полностью полагаться на хостера – то есть на его бэкапы. Всякие могут быть форс-мажоры, иногда на многие часы и даже дни выходит все оборудование провайдера – так что не помешает настроить и свою систему автоматического сохранения нужных данных. Этот код по копированию сайта и заливке файлов на яндекс диск будет полезен как минимум владельцам небольших ресурсов – блогов, магазинчиков и т.д.
Итак, условно разобьем все на три этапа. Программирование можно сравнить с кубиками, так вот эти три этапа – это и есть наши кубики, из которых можно собрать программу.
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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.