Архив сайта, форума, баз данных - бэкап на Яндекс Диск

 


I. Что это ?


Часто возникает необходимость автоматически (в том числе по расписанию) создавать бэкапы файлов сайтов, форумов, баз данных и хранить их в сети или на локальном компьютере. После появления Гугл Диска и Яндекс Диска появилась возможность хранить архивы бэкапов на них.


Библиотека класса PHP class.b2yd.php предназначена для создания бэкапов сайтов и баз данных с выгрузкой на Яндекс Диск, ftp, отправкой по e-mail.


Автор: Serg b2yd@yandex.ru © 2012


Лицензия: General Public License (LGPL)


Системные требования:


версия php не ниже 5.0.0 с поддержкой zlib, mysql, curl
сервер с cron (crontab) для запуска по расписанию и поддержкой cgi при отсутствии возможности запуска скриптов php по расписанию
остальные — в соответствии с требованиями используемых библиотек классов PHP
Благодарности:


Прототип
Прототип дампа mysql взят здесь
Спасибо авторам за предоставленные примеры !


Требуемые библиотеки:


pclzip.lib.php + исправление ошибок
class_webdav_client.php + патч + исправление ошибок
PHPMailer + исправление ошибок
class.aes256cbc.php
class.phpBB.php


 


II. Установка


Для хостингов с ограничениями по:


операциям ввода-вывода,
времени выполнения скрипта,
максимальному размеру файла,
и др.
см. пример masterhost.ru в следующей главе.


Библиотека поставляется в виде архива zip, все дополнительные скрипты включены, примеры и readme.txt в комплекте. Как устанавливать:


Переписать содержимое каталогов, включая подкаталоги, в корень своего сайта (обычно /html или /www, в примере используется /html):
root.b2yd -> /html/b2yd
root.cgi-bin -> /html/cgi-bin
Используя пример (example.class.b2yd.php) создать собственный скрипт, например, my.class.b2yd.php и переписать его в каталог /html/b2yd
Изменить права (chmod):
/html/b2yd/work (с вложенными подкаталогами и файлами) — 777
/html/cgi-bin/b2yd.cgi — 755
для скриптов PHP задать права в соответствии с требованиями хостинга — обычно 755
Проверить работу своего скрипта, задав строку в браузере:
Код:
mysite.ru/b2yd/my.class.b2yd.php?debug=2&log=1
где mysite.ru — Ваш сайт
При отсутствии ошибок по результатам проверки в предыдущем пункте добавить строку в crontab, например:
если поддерживается прямой вызов скриптов PHP:
Код:
0 2 * * 1,3,5 mysite.ru/cgi-bin/b2yd.cgi?http://mysite.ru/b2yd/my.class.b2yd.php?debug=0&log=1
если не поддерживается прямой вызов скриптов PHP, воспользуйтесь wget:
Код:
0 2 * * 1,3,5 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 «mysite.ru/cgi-bin/b2yd.cgi?http://mysite.ru/b2yd/my.class.b2yd.php?debug=0&log=1» > /dev/null
или
Код:
0 2 * * 1,3,5 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 «mysite.ru/b2yd/my.class.b2yd.php?debug=0&log=1» > /dev/null
где:
0 2 * * 1,3,5 — расписание для cron: в понедельник, среду и пятницу в 02:00
mysite.ru — Ваш сайт
/usr/local/bin/wget — путь к wget
III. Установка на хостинги с ограничениями (на примере masterhost.ru)


A) Проблемы:


В .htaccess невозможно задать требуемые параметры.
Использовать php_value запрещено, если в .htaccess такие директивы присутствуют, при попытке запуска скрипта Вы получите сообщение об ошибке !
Ограничение можно обойти следующим образом:
— Запускаем PuTTY, подключаемся, вводим логин и пароль.
— Выполняем команды:
Код:
cp /usr/local/bin/php-cgi /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi
или (в зависимости от тарифного плана)
Код:
cp /usr/local/bin/php /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi
далее:
Код:
cp /usr/local/etc/php.ini /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi.ini
chmod 755 /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi
uXXXXX и mydomain.ru замените соответственно своим параметрам.
Затем подключаем интерпретатор в .htaccess директивами:
Код:
Action php-script /cgi-bin/php-cgi
AddHandler php-script .php
После этого меняем нужные параметры в /cgi-bin/php.ini (пример прилагается — см. архив комплекта поставки).
Перегрузка сервера дисковыми операциями.
В журнале ошибок появляются записи вида:
Код:
IO limit exceeded (xx)
Resource limit exceeded, access to mydomain.ru is temporarily denied
Следует настроить параметры скрипта:
Код:
// Для хостингов, на которых может возникнуть перегрузка по дисковым операциям (IO limit exceeded)
// Для masterhost.ru — 150mb/120s с 10-кратным запасом ~ 130kb/s
// Максимум нагрузки в байтах (для masterhost.ru — 150 мегабайт за 2 минуты)
$b2yd_load_max = (150 * 1024 * 1024) / 120 / 10;
" / 10" в строке — чтобы занимать 10% от разрешенного. Однако, в результате скорость будет примерно 130 килобайт в секунду, и архивы размером в полгигабайта будут создаваться несколько часов.
Обратите внимание: чем больше список каталогов для архивирования в одной операции, тем больше PclZip выполняет рааботы с диском. Это связано с алгоритмом добавления файлов в архив.
Оптимально работать только с каталогами и не более одного на операцию.
Тайм-аут выполнения скрипта.
В журнале ошибок появляются записи вида:
Код:
Timeout waiting for output from CGI script /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi
(70007)The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed
Тайм-аут составляет около 300 секунд. Затем сервер разрывает соединение с ошибкой.
Это ограничение в настоящее время преодолено, кроме случая запуска из браузера на клиентской машине.
Максимальный размер файла.
При превышении допустимого размера файла скрипт «тихо умирает» без каких-либо сообщений в логах сервера.
В этом случае надо использовать возможность создания списка файлов и архивов из нескольких частей (см. пример: example.list.b2yd.php).
Так, для тарифов нижнего уровня на masterhot.ru стабильно работает 20МБ, можно без риска увеличить до 40-50МБ.
Запуск php-скрипта по расписанию (cron).
Необходимо добавить скрипт в crontab. Как это сделать — см. здесь.
Запуск скрипта выполняем посредством wget. Пример строки crontab:
Код:
0 1 * * 1,4 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 «mysite.ru/cgi-bin/myscript.php» > /dev/null
В примере — запуск по понедельникам и четвергам в 01:00. Вместо mysite.ru и myscript.php следует подставить свои значения.
B) Установка:


Переписать содержимое каталогов, включая подкаталоги, в корень своего сайта (обычно /www, в примере используется /www):
root.b2yd -> /html/b2yd
Если Вы не выполнили самостоятельно подключение интерпретатора, то можете попробовать использовать прилагаемый, копируйте:
root.cgi-bin.masterhost.ru -> /html/cgi-bin
Используя пример (example.class.b2yd.php) создать собственный скрипт, например, my.class.b2yd.php и переписать его в каталог /html/b2yd
Изменить права (chmod):
/www/b2yd/work (с вложенными подкаталогами и файлами) — 777
/www/cgi-bin/php.cgi — 755
/www/cgi-bin/php-cgi.cgi — 755
для скриптов PHP задать права в соответствии с требованиями хостинга — обычно 755
Проверить работу своего скрипта, задав строку в браузере:
Код:
mysite.ru/b2yd/my.class.b2yd.php?debug=2&log=1
При отсутствии ошибок по результатам проверки в предыдущем пункте добавить строку в crontab, например:
Код:
0 2 * * 1,3,5 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 «mysite.ru/cgi-bin/my.class.b2yd.php?debug=0&log=1» > /dev/null
где:
0 2 * * 1,3,5 — расписание для cron: в понедельник, среду и пятницу в 02:00
mysite.ru — Ваш сайт
/usr/local/bin/wget — путь к wget
Пример в случае создания архива из нескольких частей:
Код:
0 2 * * 1,3,5 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 «mysite.ru/cgi-bin/my.list.class.b2yd.php?debug=0&log=1» > /dev/null
0 3-8,0-1 * * * /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 «mysite.ru/cgi-bin/my.list.class.b2yd.php?debug=0&log=1&list=1» > /dev/null
где:
0 2 * * 1,3,5 — расписание для cron: понедельник, среда, пятница в 2 часа 00 минут
0 3-8,0-1 * * * — расписание для cron: ежедневно с 0 до 1 и с 3 до 8 часов в 00 минут


IV. Аварийное прекращение работы скрипта (по требованию)


Если Вы ошиблись при тестировании или скрипт слишком долго работает, достаточно переписать файл b2yd.break (см. root.b2yd/break) в подкаталог /work пути размещения b2yd.
После остановки скрипта не забудьте удалить этот файл !


V. Бонус для форумов phpBB3


См. Bender.php и Bender2.php ))


VI. Дополнительные сведения


Как сказано выше, для настройки библиотеки требуется настроить каталог для хранения временных файлов, лога и др., см. $work_dir. По умолчанию временные файлы создаются в подкаталоге ./work, в нем необходимы права на запись (777). Каталог хранения временных файлов (если задан) не входит в путь для архивирования.


В рабочем каталоге будет располагаться файл b2yd.log.txt — лог выполнения, если $log > 0.


Если задан максимальный размер файла лога ($log_max_size), то:
первым создаётся файл b2yd.log.txt, если такой файл существует и превышает заданный размер — b2yd.log1.txt и т.д.,
по достижению нумерации 9 удаляются файлы логов: b2yd.log.txt, b2yd.log1.txt… b2yd.log4.txt
затем происходит переименование b2yd.log5.txt -> b2yd.log.txt, b2yd.log6.txt -> b2yd.log1.txt… b2yd.log9.txt -> b2yd.log4.txt и активным становится b2yd.log5.txt,
таким образом, всегда остаются как минимум 5 последних файлов логов.
Права для скриптов — в соответствии с требованиями хостинга (обычно 755).


Скрипт удобнее всего размещать в папке /b2yd. Обычно в www или html, то есть там, где хранятся файлы сайта.


Формат имени архивного файла на Яндекс Диске:
<префикс><тип><дата и время>[_hash_].zip
где:
<имя> — параметр backup_name, если опущен — то "", где n — номер архива в массиве бэкапов, считаетя с 1
<тип> — "_files" для бэкапа файлов, "_mysql_<имя базы данных>" для баз данных MySQL
<дата и время> — "_" и затем дата и время в формате функции data «YmdHis» (можно изменить);
— если разрешено добавление hash к имени файла (суффикс, см. $add_hash), то:
если $add_hash равен 'md5' (умолчание) — md5 файла (если удалось получить) в формате _md5_<строка md5>
если $add_hash равен 'sha1' — sha1 файла (если удалось получить) в формате _sha1_<строка sha1>
Если файл зашифрован, к нему добавляется расширение .enc; зашифрованный файл можно расшифровать утилитой openssl (см. openssl.org, для Windows дистрибутив можно найтиздесь, а описание ключей, например, здесь). Пример командной строки (как расшифровать):
Код:
openssl enc -d -aes-256-cbc -salt -pass pass:mypass -in myfile.zip.enc -out myfile.zip
где вместо 'mypass' подставьте свой пароль, вместо 'myfile' — имя своего файла. Для расшифровки нескольких файлов под Windows, если пароли для всех файлов одинаковые, удобно сделать командный файл (пример):
Код:
@echo off
for %%i in (*.zip.enc) do openssl enc -d -aes-256-cbc -salt -pass pass:mypass -in %%i -out %%~ni
где ~ni означает, что надо использовать имя файла без расширения (то есть без последнего .enc).
Под unix-подобной ОС, полагаю, сделать подобное никому не составит труда))

Не рекомендуется включать много файлов или каталогов в один архив, используя $backup_dir с массивом из многих элементов, это может вызвать большую нагрузку на сервер! Лучше создайте много маленьких архивов, процесс архивации пойдет значительно быстрее и будет требовать меньше дисковых операций (это особенности реализации PclZip). Оптимальный вариант — по одному каталоу в архиве. Рекомендуется располагать операции с файлами (например, '../*.*') первыми, если их объем меньше объема содержимого каталогов, включаемых в архив.


Если скрипт завершается по превышению максимально допустимого времени выполнения, то попробуйте:
Измените max_execution_time в php.ini, если есть доступ, иначе
Если используется apache, создайте .htaccess в каталоге, где располагается скрипт, с таким содержимым (или добавьте, если файл существует)
Код:
php_value max_execution_time «36000»
php_value upload_max_filesize «64M»
php_value post_max_size «64M»
php_value memory_limit "-1"
Собственно, нужен только max_execution_time, остальное — для ускорения работы.
VII. Типовой пример (examlpe.class.b2yd.php)


Код:
<?php
//
// b2yd@yandex.ru : Создание архива сайта и баз данных с выгрузкой на Яндекс Диск.
//
// class.b2yd.php v.2.1.0
// Пример
// crontab: 30 00 * * 2,5 /usr/local/bin/wget -b -O /dev/null -T 3600 -t 1 'http://mysite.ru/cgi-bin/mysite.class.b2yd.php' > /dev/null
// Расписание: по вторникам и пятницам в 00:30


// Класс b2yd
require_once('class.b2yd.php');
$b2yd = new b2yd();


// Рабочий каталог (для временых файлов, лога и файла прекращения выполнения) без слэша в конце
// Если задан, то этот каталог всегда исключается из файловых архивов.
$b2yd->work_dir = './work'; // Рабочий каталог (например, './work', требуются права на запись - 777)


// Отладочная информация (глобальная переменная)
$b2yd->debug = 2; // 0 - нет, > 0 - уровень отладки (обычно 1)
$b2yd->log = 1; // 0 - нет, иначе вести лог в текущем каталоге в файле $work_dir/b2yd.log.txt (требуются права на запись - 777)
$b2yd->log_max_size = 256 * 1024; // 0 - не учитывать, иначе максимальный размер файла лога, после которого переходим на следующий


// Поправка для времени сервера (не все указали зону UTC+4)
$b2yd->timeaddh = 0; // 0 - нет, иначе, например, плюс 1 час


// Время выполнения скриптов
$b2yd->timeout = 36000; // 10 часов


// Для хостингов, на которых может возникнуть перегрузка по дисковым операциям (IO limit exceeded)
$b2yd->load_max = 0; // Максимум нагрузки байт/сек (для masterhost.ru - 150 мегабайт за 2 минуты)
// Для masterhost.ru - 150mb/120s с 10-кратным запасом ~ 130kb/s
//$b2yd->load_max = (150 * 1024 * 1024) / 120 / 10; // Максимум нагрузки в байтах (для masterhost.ru - 150 мегабайт за 2 минуты)


// Параметры запуска
if($b2yd->request_var('debug',-1) >= 0) $b2yd->debug = $b2yd->request_var('debug',-1);
if($b2yd->request_var('log',-1) >= 0) $b2yd->log = $b2yd->request_var('log',-1);
if($b2yd->request_var('timeaddh',-1) >= 0) $b2yd->timeaddh = $b2yd->request_var('timeaddh',-1);
if($b2yd->request_var('timeout',-1) >= 0) $b2yd->timeout = $b2yd->request_var('timeout',-1);
if($b2yd->request_var('load_max',-1) >= 0) $b2yd->load_max = $b2yd->request_var('load_max',-1);


// Работаем
$b2yd->job(
// Хранилища
array(
// Яндекс Диск
array(
// Логин
'yandex_login' => 'mylogin',
// Если задан массив логинов - хранилища выбираются последовательно для каждого нового бэкапа,
// что позволяет избавиться от ограничений размера Яндекс Диска, подключив несколько штук
//'yandex_login' => array('mylogin', 'mylogin2', 'mylogin3', 'mylogin4', 'mylogin5'),
// Пароль
'yandex_pass' => 'mypass',
// Если задан массив логинов и пароли разные - следует задать аналогичный по размеру массив паролей (см. ниже),
// если пароль одинаковый для всех логинов, задать его один раз (как в примере выше)
//'yandex_pass' => array('mypass', 'mypass2', 'mypass3', 'mypass4', 'mypass5'),
// Папка на Яндекс Диске не выше 1 уровня (если не существует - создается, например: /test)
'yandex_dir' => '/BackUps.mysite.ru',
// Сколько предыдущих архивов с таким префиксом имени хранить (0 - без ограничений, 1 - хранится 2 архива: предыдущий и текущий)
// Предыдущие архивы удаляются только если $yandex_nfiles имет ненулевое значение
'yandex_nfiles' => 14,
// Сколько предыдущих архивов хранить, если нет места на диске (0 - опция отключена)
// В случае отсутсвия места на диске предыдущие архивы удаляются только если $yandex_nsfiles имет ненулевое значение
'yandex_nsfiles' => 7,
),
),
// Бэкапы
array(
// Бэкап файлов
array(
// Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
// Могут использоваться маски. Может задаваться массив.
'backup_dir' => array('../forum', '../site'),
// Пропускаемые файлы и каталоги (массив) для любого $backup_dir и $bacup_nosub, путь задается без их учета
'backup_skip' => array('forum/cache/*.php'),
// Имя бэкапа
'backup_name' => 'www_full',
),
// Бэкап баз данных
array(
// Имя хоста
'backup_db_host' => 'localhost',
// Имя базы данных
'backup_db_name' => 'db_mysite1',
// Имя пользователя
'backup_db_user' => 'mysite1',
// Пароль пользователя
'backup_db_pass' => 'pass1',
// Имя бэкапа
'backup_name' => 'www_phpbb',
// Шифровать файл архива (если задан), алгоритм aes-256-cbc + salt
'backup_enc_alg' => 'aes256cbc',
// Пароль на зашифрованный файл архива
'backup_enc_pass' => 'mypass',
),
array(
// Имя хоста
'backup_db_host' => 'localhost',
// Имя базы данных
'backup_db_name' => 'db_mysite2',
// Имя пользователя
'backup_db_user' => 'mysite2',
// Пароль пользователя
'backup_db_pass' => 'pass2',
// Имя бэкапа
'backup_name' => 'www_drupal',
),
),
// Уведомления
array(
// email
array (
// Если параметры с префиксом email_smtp задан - отправка через указанный smtp сервер.
// Иначе (параметры smtp закомментированы или отсутствуют) - отправка с использованием транспорта mail - см. функция PHP mail().
// Для masterhost.ru следует использовать mail.
// Сервер smtp для отправки почты (без префиксов "http://" и завершающего "/", можно указать два сервера - через ";")
'email_smtp_server' => 'smtp.yandex.ru',
// Порт сервера smtp (по умолчанию 25)
//'email_smtp_port' => 25,
// Аутентификация smtp (параметр опущен или 0 - не нужна, иначе - нужна)
'email_smtp_auth' => 1,
// Шифрование (параметр опущен или пустой - нет, иначе можно задать 'tls' или 'ssl')
//'email_smtp_secure' => '',
// Логин
'email_smtp_login' => 'b2yd_myservice',
// Пароль
'email_smtp_pass' => 'b2yd_mypass',
// E-mail отправителя (если опущен или пустой - 'b2yd@yandex.ru')
'email_from' => 'b2yd_myemail@yandex.ru',
// Имя отправителя (если опущено или пустое - b2yd)
'email_fromname' => 'myname',
// Адрес получателей, массив
'email_to' => array('b2yd_save1@yandex.ru', 'b2yd_save2@yandex.ru'),
// Адрес ответа (если опущен или пустой - данные берутся из $email_from)
'email_replyto' => 'my_email@yandex.ru',
// Адрес копии (если опущен или пустой - нет)
//'email_cc' => 'to2email@mydomian.ru',
// Адрес скрытой копии (если опущен или пустой - нет)
//'email_bcc' => 'to3email@mydomian.ru',
// Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
// Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
'email_onstart' => 1,
),
// phpbb3
array (
// URL форума phpbb3 (с префиксом "http://" и без завершающего "/")
'phpbb3_server' => 'http://mysite.ru/forum',
// Логин на форуме (бот-пользователь должен быть заранее создан)
'phpbb3_login' => 'b2yd bot',
// Пароль
'phpbb3_pass' => '123456',
// Номер форума (бот-пользователь должен иметь права на размещение сообщений в этом форуме)
'phpbb3_forum' => 111,
// Номер темы (бот-пользователь должен иметь права на размещение сообщений в этой теме)
'phpbb3_topic' => 222,
// Тема сообщения (если опущена, используется по умолчанию, обычно <Re: ><тема предыдущего сообщения>)
'phpbb3_subject' => 'mysite.ru',
// Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
// Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
//'phpbb3_onstart' => 1,
),
)
);


$b2yd->job(
// Хранилища
array(
// Яндекс Диск
array(
// Логин
'yandex_login' => 'mylogin',
// Пароль
'yandex_pass' => 'mypass',
// Папка на Яндекс Диске не выше 1 уровня (если не существует - создается, например: /test)
'yandex_dir' => '/BackUps.mysite2.ru',
// Сколько предыдущих архивов с таким префиксом имени хранить (0 - без ограничений, 1 - хранится 2 архива: предыдущий и текущий)
// Предыдущие архивы удаляются только если $yandex_nfiles имет ненулевое значение
'yandex_nfiles' => 10,
// Сколько предыдущих архивов хранить, если нет места на диске (0 - опция отключена)
// В случае отсутсвия места на диске предыдущие архивы удаляются только если $yandex_nsfiles имет ненулевое значение
'yandex_nsfiles' => 5,
),
// ftp
array(
// Сервер (без префиксов "ftp://", "ftp." и завершающего "/")
'ftp_server' => 'myftp.ru',
// Порт (параметр может быть опущен)
//'ftp_port' => 21,
// Пассивные режим (если задано любое непустое и ненулевое значение, если параметр опущен или иное знчение - то активный режим)
'ftp_passive' => 1,
// Тайм-аут (параметр может быть опущен, тогда принимается 90 сек)
//'ftp_timeout' => 1000,
// Права доступа (восьмеричное значение, параметр может быть опущен)
//'ftp_chmod' => 0777,
// Логин
'ftp_login' => 'myftplogin',
// Пароль
'ftp_pass' => 'myftppass',
// Папка на ftp-сервере (например, "/dir1/dir2"), если параметр опущен - корневая
'ftp_dir' => '/backups',
// Сколько предыдщих архивов с таким префиксом имени хранить (0 - без ограничений, 1 - хранится 2 архива: предыдущий и текущий)
// Предыдущие архивы удаляются только если $ftp_nfiles имет ненулевое значение
'ftp_nfiles' => 5,
),
// email
array (
// Если параметры с префиксом email_smtp задан - отправка через указанный smtp сервер.
// Иначе (параметры smtp закомментированы или отсутствуют) - отправка с использованием транспорта mail - см. функция PHP mail().
// Для masterhost.ru следует использовать mail.
// Сервер smtp для отправки почты (без префиксов "http://" и завершающего "/", можно указать два сервера - через ";")
'email_smtp_server' => 'smtp.yandex.ru',
// Порт сервера smtp (по умолчанию 25)
//'email_smtp_port' => 25,
// Аутентификация smtp (параметр опущен или 0 - не нужна, иначе - нужна)
'email_smtp_auth' => 1,
// Шифрование (параметр опущен или пустой - нет, иначе можно задать 'tls' или 'ssl')
//'email_smtp_secure' => '',
// Логин
'email_smtp_login' => 'b2yd_myservice',
// Пароль
'email_smtp_pass' => 'b2yd_mypass',
// E-mail отправителя (если опущен или пустой - 'b2yd@yandex.ru')
'email_from' => 'b2yd_myemail@yandex.ru',
// Имя отправителя (если опущено или пустое - b2yd)
'email_fromname' => 'myname',
// Адрес получателей, массив
'email_to' => array('b2yd_save1@yandex.ru', 'b2yd_save2@yandex.ru', 'b2yd_save3@yandex.ru'),
// Адрес ответа (если опущен или пустой - данные берутся из $email_from)
'email_replyto' => 'my_email@yandex.ru',
// Адрес копии (если опущен или пустой - нет)
//'email_cc' => 'to2email@mydomian.ru',
// Адрес скрытой копии (если опущен или пустой - нет)
//'email_bcc' => 'to3email@mydomian.ru',
),
),
// Бэкапы
array(
// Бэкап файлов
array(
// Относительный путь к архивируемым файлам
'backup_dir' => '../forum',
// Пропускаемые файлы и каталоги (массив) без учета $backup_dir
'backup_skip' => array('*'.'/cache/'.'*.php'),
// Имя бэкапа
'backup_name' => 'www_phpbb3',
),
// Бэкап баз данных
array(
// Имя хоста
'backup_db_host' => 'localhost',
// Имя базы данных
'backup_db_name' => 'db_mysite1',
// Имя пользователя
'backup_db_user' => 'mysite1',
// Пароль пользователя
'backup_db_pass' => 'pass1',
// Имя бэкапа
'backup_name' => 'www_phpbb3',
),
)
);


?>


VIII. Типовой пример работы с создаваемым списком (examlpe.class.b2yd.php)


Код:
<?php
//
// b2yd@yandex.ru : Создание архива сайта и баз данных с выгрузкой на Яндекс Диск.
//
// class.b2yd.php v.2.1.0
// Пример
// Создание списков
// crontab: 30 00 * * 2,5 /usr/local/bin/wget -b -O /dev/null -T 3600 -t 1 'http://mysite.ru/cgi-bin/mysite.list.class.b2yd.php' > /dev/null
// Расписание: по вторникам и пятницам в 00:30
// Обработка списков
// crontab: 30 1-23 * * * /usr/local/bin/wget -b -O /dev/null -T 3600 -t 1 'http://mysite.ru/cgi-bin/mysite.list.class.b2yd.php?list=1' > /dev/null
// Расписание: ежедневно начиная с 01:30 наждый час


// Класс b2yd
require_once('class.b2yd.php');
$b2yd = new b2yd();


// Рабочий каталог (для временых файлов, лога и файла прекращения выполнения) без слэша в конце
// Если задан, то этот каталог всегда исключается из файловых архивов.
$b2yd->work_dir = './work'; // Рабочий каталог (например, './work', требуются права на запись - 777)


// Отладочная информация (глобальная переменная)
$b2yd->debug = 2; // 0 - нет, > 0 - уровень отладки (обычно 1)
$b2yd->log = 1; // 0 - нет, иначе вести лог в текущем каталоге в файле $work_dir/b2yd.log.txt (требуются права на запись - 777)


// Поправка для времени сервера (не все указали зону UTC+4)
$b2yd->timeaddh = 0; // 0 - нет, иначе, например, плюс 1 час


// Время выполнения скриптов
$b2yd->timeout = 3600; // 1 час


// Для хостингов, на которых может возникнуть перегрузка по дисковым операциям (IO limit exceeded)
$b2yd->load_max = 0; // Максимум нагрузки байт/сек (для masterhost.ru - 150 мегабайт за 2 минуты)
// Для masterhost.ru - 150mb/120s с 10-кратным запасом ~ 130kb/s
//$b2yd->load_max = (150 * 1024 * 1024) / 120 / 10; // Максимум нагрузки в байтах (для masterhost.ru - 150 мегабайт за 2 минуты)


// Параметры запуска
if($b2yd->request_var('debug',-1) >= 0) $b2yd->debug = $b2yd->request_var('debug',-1);
if($b2yd->request_var('log',-1) >= 0) $b2yd->log = $b2yd->request_var('log',-1);
if($b2yd->request_var('timeaddh',-1) >= 0) $b2yd->timeaddh = $b2yd->request_var('timeaddh',-1);
if($b2yd->request_var('timeout',-1) >= 0) $b2yd->timeout = $b2yd->request_var('timeout',-1);
if($b2yd->request_var('load_max',-1) >= 0) $b2yd->load_max = $b2yd->request_var('load_max',-1);


// Список ?
$list = $b2yd->request_var('list',0);
$max = $b2yd->request_var('max',20 * 1024 * 1024);


// Параметры операций - пример для сайта + форума на движке phpbb3
$storage =
// Хранилища
array(
// Ханилище - Яндекс Диск
array(
// Логин
'yandex_login' => 'mylogin',
// Если задан массив логинов - хранилища выбираются последовательно для каждого нового бэкапа,
// что позволяет избавиться от ограничений размера Яндекс Диска, подключив несколько штук
//'yandex_login' => array('mylogin', 'mylogin2', 'mylogin3', 'mylogin4', 'mylogin5'),
// Пароль
'yandex_pass' => 'mypass',
// Если задан массив логинов и пароли разные - следует задать аналогичный по размеру массив паролей (см. ниже),
// если пароль одинаковый для всех логинов, задать его один раз (как в примере выше)
//'yandex_pass' => array('mypass', 'mypass2', 'mypass3', 'mypass4', 'mypass5'),
// Папка на Яндекс Диске не выше 1 уровня (если не существует - создается, например: /test)
'yandex_dir' => '/BackUps.mysite.ru',
// Сколько предыдущих архивов с таким префиксом имени хранить (0 - без ограничений, 1 - хранится 2 архива: предыдущий и текущий)
// Предыдущие архивы удаляются только если $yandex_nfiles имет ненулевое значение
'yandex_nfiles' => 14,
// Сколько предыдущих архивов хранить, если нет места на диске (0 - опция отключена)
// В случае отсутсвия места на диске предыдущие архивы удаляются только если $yandex_nsfiles имет ненулевое значение
'yandex_nsfiles' => 7,
)
);
$backup =
// Бэкапы
array(
// Бэкап баз данных
$list ? '' :
array(
// Имя хоста
'backup_db_host' => 'localhost',
// Имя базы данных
'backup_db_name' => 'db_mysite1',
// Имя пользователя
'backup_db_user' => 'mysite1',
// Пароль пользователя
'backup_db_pass' => 'pass1',
// Имя бэкапа
'backup_name' => 'www_phpbb',
),
$list ? '' :
array(
// Имя хоста
'backup_db_host' => 'localhost',
// Имя базы данных
'backup_db_name' => 'db_mysite2',
// Имя пользователя
'backup_db_user' => 'mysite2',
// Пароль пользователя
'backup_db_pass' => 'pass2',
// Имя бэкапа
'backup_name' => 'www_drupal',
),
// Бэкап файлов
$list ? '' : array(
// Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
// Могут использоваться маски. Может задаваться массив.
'backup_dir' => array('../*.*', '../site'),
// Пропускаемые файлы и каталоги (массив) без учета $backup_dir
//'backup_skip' => array(),
// Имя бэкапа
'backup_name' => 'www_root_and_site',
// Создать списки файлов вместо бэкапа (если задан и нулевой) или обработать очередной фрагмент списка (если задан и ненулевой)
//'backup_list' => $list,
// Максимальный размер несжатых файлов для архива файлов в одном списке (по умолчанию 100 МБ)
//'backup_max' => $max,
),
$list ? '' : array(
// Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
// Могут использоваться маски. Может задаваться массив.
'backup_dir' => array('../forum'),
// Пропускаемые файлы и каталоги (массив) без учета $backup_dir
'backup_skip' => array('*/forum/files/*', '*/forum/images/avatars/upload/*', '*/forum/cache/*.php', '*/forum/store/*.gz'),
// Имя бэкапа
'backup_name' => 'www_forum',
// Создать списки файлов вместо бэкапа (если задан и нулевой) или обработать очередной фрагмент списка (если задан и ненулевой)
//'backup_list' => $list,
// Максимальный размер несжатых файлов для архива файлов в одном списке (по умолчанию 100 МБ)
//'backup_max' => $max,
),
// Бэкап файлов по списку (аватарки форума)
array(
// Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
// Могут использоваться маски. Может задаваться массив.
'backup_dir' => '../forum/images/avatars/upload',
// Пропускаемые файлы и каталоги (массив) для любого $backup_dir и $bacup_nosub, путь задается без их учета
//'backup_skip' => array(),
// Имя бэкапа
'backup_name' => 'www_forum_images_avatars_upload',
// Создать списки файлов вместо бэкапа (если задан и нулевой) или обработать очередной фрагмент списка (если задан и ненулевой)
'backup_list' => $list,
// Максимальный размер несжатых файлов для архива файлов в одном списке (по умолчанию 100 МБ)
'backup_max' => $max,
),
// Бэкап файлов по списку (аттачи форума)
array(
// Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
// Могут использоваться маски. Может задаваться массив.
'backup_dir' => '../forum/files',
// Пропускаемые файлы и каталоги (массив) для любого $backup_dir и $bacup_nosub, путь задается без их учета
//'backup_skip' => array(),
// Имя бэкапа
'backup_name' => 'www_forum_files',
// Создать списки файлов вместо бэкапа (если задан и нулевой) или обработать очередной фрагмент списка (если з 'www_drupal',
),
),
// Уведомления
array(
// email
array (
// Если параметры с префиксом email_smtp задан - отru is temporarily denied[/co 'www_drupal',
),
),
// Уведомления
array(
// email
array (
// Если параметры с префиксом email_smtp задан - отправка через указанный smtp серверde]Сле array(
// Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем дует настроить параметры скрипта:[code]// Для хостингов, на которых может возникнуть перегрузка по дисковым операциям (IO limit exceeded)
// Для masterhostlog=1правка через указанный smtp сервер array(
// Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем array(
// Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем адан и ненулевой)
'backup_list' => $list,
// Максимальный размер несжатых файлов для архива файлов в одном списке (по умолчанию 100 МБ)
'backup_max' => $max,
),
);
$notice =
// Уведомления
array(
// email
array (
// Е 30 00 * * 2,5 /usr/local/bin/wget -b -O /dev/null -T 3600 -t 1 'httpсли параметры с префиксом email_smtp задан - отправка через указанный smtp сервер.
// Иначе (параметры smtp закомментированы или отсутствуют) - отправка с использованием транспорта mail - см. функция PHP mail().
// Для masterhost.ru следует использовать mail.
// Сервер smtp для отправки почты (без префиксов "http://" и завершающего "/", можно указать два сервера - через ";")
'email_smtp_server' => 'smtp.yandex.ru',
// Порт сервера smtp (по умолчанию 25)
//'email_smtp_port' => 25,
// Аутентификация smtp (параметр опущен или 0 - не нужна, иначе - нужна)
'email_smtp_auth' => 1,
// Шифрование (параметр опущен или пустой - нет, иначе можно задать 'tls' или 'ssl')
//'email_smtp_secure' => '',
// Логин
'email_smtp_login' => 'b2yd_myservice',
// Пароль
'email_smtp_pass' => 'b2yd_mypass',
// E-mail отправителя (если опущен или пустой - 'b2yd@yandex.ru')
'email_from' => 'b2yd_myemail@yandex.ru',
// Имя отправителя (если опущено или пустое - b2yd)
'email_fromname' => 'myname',
// Адрес получателей, массив
'email_to' => array('b2yd_save1@yandex.ru', 'b2yd_save2@yandex.ru'),
// Адрес ответа (если опущен или пустой - данные берутся из $email_from)
'email_replyto' => 'my_email@yandex.ru',
// Адрес копии (если опущен или пустой - нет)
//'email_cc' => 'to2email@mydomian.ru',
// Адрес скрытой копии (если опущен или пустой - нет)
//'email_bcc' => 'to3email@mydomian.ru',
// Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
// Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
'email_onstart' => 1,
),
// phpbb3
array (
// URL форума phpbb3 (с префиксом "http://" и без завершающего "/")
'phpbb3_server' => 'http://mysite.ru/forum',
// Логин на форуме (бот-пользователь должен быть заранее создан)
'phpbb3_login' => 'b2yd bot',
// Пароль
'phpbb3_pass' => '123456',
// Номер форума (бот-пользователь должен иметь права на размещение сообщений в этом форуме)
'phpbb3_forum' => 111,
// Номер темы (бот-пользователь должен иметь права на размещение сообщений в этой теме)
'phpbb3_topic' => 222,
// Тема сообщения (если опущена, используется по умолчанию, обычно <Re: ><тема предыдущего сообщения>)
'phpbb3_subject' => 'mysite.ru',
// Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
// Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
//'phpbb3_onstart' => 1,
),
);


// Работаем
$b2yd->job(
// Хранилища
$storage,
// Бэкапы
$backup,
// Уведомления
$notice
);


?>


При необходимости получения SMS по выполнению бэкапа можно воспользоваться сервисами mail.ru.


Скачать:b2yd_v_2_1_3.zip


Скачать с Яндекс Диска : b2yd_v_2_1_3.zip




Комментарии (0)

    Авторизация через сервис Loginza: Yandex Google Вконтакте Mail.ru Twitter Loginza MyOpenID OpenID WebMoney