Автоматическое копирование сайта и базы на яндекс диск


Я не буду тут распространяться о важности бэкапов – вы и так наверняка все знаете об этом. Единственно, что отдельно замечу, что не стоит целиком и полностью полагаться на хостера – то есть на его бэкапы. Всякие могут быть форс-мажоры, иногда на многие часы и даже дни выходит все оборудование провайдера – так что не помешает настроить и свою систему автоматического сохранения нужных данных. Этот код по копированию сайта и заливке файлов на яндекс диск будет полезен как минимум владельцам небольших ресурсов – блогов, магазинчиков и т.д.

Итак, условно разобьем все на три этапа. Программирование можно сравнить с кубиками, так вот эти три этапа – это и есть наши кубики, из которых можно собрать программу.

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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, php, сайтостроение, яндекс




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Рецепты, кулинария
Пропадает интернет на tele2: решаем проблему
Как понять, почему не работает форма обратной связи на MODx