На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

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



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

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

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, сайтостроение, яндекс





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




Пример работы с IntelliJ IDEA и JavaFX
Альтернативное средневековье от Пехова


© upread.ru 2013-2022
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.