Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Резервное копирование веб-планов на Яндекс.Диск без ООП и натурщиц

Anna | 31.05.2014 | нет комментариев

Позавчера програюзер vasiatka в посте №206752 поделился с програсообществом, а следственно и со каждому остальным миром, продуманным и крайне развитым классом для работы с Яндекс.Диском. Некоторое время назад я тоже стал применять данный сервис для хранения там бэкапов. Хочу поделиться гораздо больше коротким вариантом скрипта на php, тот, что делает архивы базы данных и файлов сайта, и заливает их по WebDAV. Допустимо кому-то и он придётся по душе.

Если кто-то хочет сразу взглянуть на полный листинг — он внизу.

Изложение

Скрипт, тот, что я предлагаю вашему вниманию, достаточно лаконичный. Если исключить задание параметров и итог отчета, то останется что-то около тридцати строк. И правда параметры и их наименования говорят сами за себя, я всё же опишу их с комментариями.

Настройки

 

Логин и пароль

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

$yadisk_email = 'login@yandex.ru';
$yadisk_pass = 'password';
Путь на Яндекс.Диске

Папку, куда вы планируете складывать свои драгоценные архивы, стоит сделать независимо предварительно. Я не уверен, что она может возникнуть механически.

$yadisc_dir = 'backups/sites';
Локальный путь для создания архивов

Правда архивацию и заливку на сервис дозволено сделать одной строкой, в моём скрипте раньше чем загрузить файл, требуется его где-то сделать. Путь для создания архивов задаётся в этой переменной.

$backupPath

Дозволено размещать хранилище локальных копий внутри сайта, а путь добавить в список исключенных из архивирования путей.

Список баз данных

Записывайте в массив $databases те базы, которые вы хотите архивировать. Видимо стоит сделать пользователя в БД без прав метаморфозы и записи для такого применения.

$databases = [['login' => '', 'password' => '', 'dbname' => '']];
Список сайтов

Типовой вид одного из членов массива $sites — списка архивируемых сайтов.

    'name' => 'site1.ru',
    'path' => '/var/www/site1.ru',
    'exclude' => []

1-й параметр — наименование сайта. Легко строка, которая будет приписываться к имени архива вашего сайта.
2-й — путь к файлам сайта.
3-й — список директорий, которые стоит исключить из архивации. Исключение отдельных файлов я не предусмотрел, но вы можете легко это добавить независимо. Если вы создаёте архивы внутри одного из своих сайтов, то можете исключить это хранилище.
Пример:

    'exclude' => [
      $backupPath, //Исключить папку с бэкапами, если она находится внутри одного из сайтов
      '/var/www/site2.ru/temp' //Исключим что-нибудь еще
    ]

На этом конфигурация скрипта заканчивается, и он готов работать во благо революции… социума… вебадмина.

Если база данных маленькая, а файлы весят не слишком много, то дозволено вызывать скрипт кроном хоть всякий час. Файлы с идентичными именами будут перезаписываться и в локальном хранилище, и на Яндекс.Диске. На следющий день будет создаваться файл с новой датой и приблизительно таким именем:
site1.ru.2013-12-20.zip
Если же вы хотите давать архивам неповторимое имя всякий раз, то стоит заменить строку

$date = date('Y-m-d');

на

$date = date('Y-m-d-H-i-s');

и тогда дата будет с указанием времени вплотную до секунд.

Слушайте, и не говорите, что не слышали

Хочу предупредить, что данный скрипт не претендует на надёжный способ бэкапа Зачастую меняющихся сайтов, сайтов с тяжелой базой данных, либо иных взрослых и серьёзных веб-планов. Но для сайтов-визиток — самое то.

Отчего Яндекс.Диск

Я пользуюсь другими сходственными сервисами для личных нужд, включая BitTorrent Sync. И пользуюсь ими крайне энергично. Но как-то так исторически сложилось, что Яндекс.Диском я пользуюсь предпочтительно для бэкпаов и загрузки Теории Большого Взрыва на HTPC.

Собственно всё

Спасибо, что уделили внимание и прочли данный пост. Верю, кому-то моя поделка облегчит жизнь, сердечное умиротворение, и даже допустимо спасёт в тяжелую минуту. Везения!

Полный листинг


$yadisk_email = 'login@yandex.ru';
$yadisk_pass = 'password';
$yadisc_dir = 'backups/sites'; //нужно сделать папку руками на Яндекс.Диске раньше, чем лить бэкапы.
$backupPath = 'path to backups'; //папка, куда складывать бэкапы локально на сервере, раньше чем залить по WebDAV
$databases = [['login' => '', 'password' => '', 'dbname' => '']];
$sites = [
  //конфиг обыкновенного сайта:
  [
    'name' => 'site1.ru',
    'path' => '/var/www/site1.ru',
    'exclude' => []
  ],
  //конфиг с демонстрацией допустимых вариантов
  ['name' => 'site2.ru',
    'path' => '.', //Вы можете применять 'path' => '.' Дабы архивировать сайт, внутри которого лежит данный скрипт.
    'exclude' => [ //Если требуется исключить какие-то папки, то это дозволено сделать сдесь. Исключение отдельных файлов я не предусмотрел, но вы можете легко это добавить независимо.
      $backupPath, //Исключить папку с бэкапами, если она находится внутри одного из сайтов
      '/var/www/site2.ru/temp' //Исключим что-нибудь еще
    ]
  ],
];
// Конфигурационная часть на этом заканчивается.
/////////////////////////////////////////////////////////////////////////////////////////
//Если не прописать в дату часы и минуты, то имена файлов будут совпадать, и файл на Яндекс.Диске будет перезаписан.
//Соотв. дозволено делать бэкап всякий час, при этом файлы не будут излишне плодиться.
//На дальнейший день будет сделан новейший файл.
$date = date('Y-m-d');
$errors = [];
$success = [];
$files_to_send = [];

foreach ($databases as $db) {
  $filename = "$backupPath/bases/{$db['dbname']}.$date.sql.gz";
  $output = `mysqldump --user={$db['login']} --password={$db['password']} {$db['dbname']} | gzip -f > $filename`;
  if (!file_exists($filename)) {
    $errors[] = 'Dump ' . $db['dbname'] . ' failed: ' . $output;
  } else {
    $success[] = 'DB ' . $db['dbname'] . ' dumped';
    $files_to_send[] = $filename;
  }
}

foreach ($sites as $site) {
  $filename = "$backupPath/files/{$site['name']}.$date.zip";
  $exclude = '';
  if ($site['exclude']) {
    $exclude = '-x ' . implode('\* -x ', $site['exclude']) . '\*';
  }
  $cmd = "zip -r \"$filename\"  {$site['path']} $exclude";
  echo $cmd . "<br>\n";
  $output = `$cmd`;
  if (!file_exists($filename)) {
    $errors[] = 'Site backup ' . $site['name'] . ' failed: ' . $output;
  } else {
    $success[] = 'Site ' . $site['name'] . ' saved';
    $files_to_send[] = $filename;
  }
}

foreach ($errors as $e) {
  echo 'Оплошность: ' . $e . "<br>\n";
}
echo "<br>\n";

foreach ($success as $s) {
  echo 'ОК: ' . $s . "<br>\n";
}
echo "<br>\n";

echo "Следующие файлы будут загружены:<br>\n";
foreach ($files_to_send as $f) {
  echo $f . "<br>\n";
}
echo "<br>\n";

if (!empty($files_to_send)) {
  foreach ($files_to_send as $file) {
    echo shell_exec("curl --user $yadisk_email:$yadisk_pass -T \"$file\" https://webdav.yandex.ru/$yadisc_dir/") . "<br>\n";
  }
}

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB