Часто возникает необходимость автоматически (в том числе по расписанию) создавать бэкапы файлов сайтов, форумов, баз данных и хранить их в сети или на локальном компьютере. После появления Гугл Диска и Яндекс Диска появилась возможность хранить архивы бэкапов на них.
Библиотека класса PHP class.b2yd.php предназначена для создания бэкапов сайтов и баз данных с выгрузкой на Яндекс Диск, ftp, отправкой по e-mail.
Автор: Serg (c) 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
Для хостингов с ограничениями по:
- операциям ввода-вывода,
- времени выполнения скрипта,
- максимальному размеру файла,
- и др.
Библиотека поставляется в виде архива 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 - Проверить работу своего скрипта, задав строку в браузере:
- Код: Выделить всё
http://mysite.ru/b2yd/my.class.b2yd.php?debug=2&log=1
- При отсутствии ошибок по результатам проверки в предыдущем пункте добавить строку в crontab, например:
если поддерживается прямой вызов скриптов PHP:- Код: Выделить всё
0 2 * * 1,3,5 http://mysite.ru/cgi-bin/b2yd.cgi?http://mysite.ru/b2yd/my.class.b2yd.php?debug=0&log=1
- Код: Выделить всё
0 2 * * 1,3,5 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 "http://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 "http://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
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
Затем подключаем интерпретатор в .htaccess директивами:- Код: Выделить всё
Action php-script /cgi-bin/php-cgi
AddHandler php-script .php
- Перегрузка сервера дисковыми операциями.
В журнале ошибок появляются записи вида:- Код: Выделить всё
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;
Обратите внимание: чем больше список каталогов для архивирования в одной операции, тем больше 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
Это ограничение в настоящее время преодолено, кроме случая запуска из браузера на клиентской машине. - Максимальный размер файла.
При превышении допустимого размера файла скрипт "тихо умирает" без каких-либо сообщений в логах сервера.
В этом случае надо использовать возможность создания списка файлов и архивов из нескольких частей (см. пример: 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 "http://mysite.ru/cgi-bin/myscript.php" > /dev/null
- Переписать содержимое каталогов, включая подкаталоги, в корень своего сайта (обычно /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 - Проверить работу своего скрипта, задав строку в браузере:
- Код: Выделить всё
http://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 "http://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 "http://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 "http://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 последних файлов логов.
Скрипт удобнее всего размещать в папке /b2yd. Обычно в www или html, то есть там, где хранятся файлы сайта.
Формат имени архивного файла на Яндекс Диске:
<префикс><тип><дата и время>[_hash_<hash>].zip
где:
<имя> - параметр backup_name, если опущен - то "<n>", где n - номер архива в массиве бэкапов, считаетя с 1
<тип> - "_files" для бэкапа файлов, "_mysql_<имя базы данных>" для баз данных MySQL
<дата и время> - "_" и затем дата и время в формате функции data "YmdHis" (можно изменить);
<hash> - если разрешено добавление hash к имени файла (суффикс, см. $add_hash), то:- если $add_hash равен 'md5' (умолчание) - md5 файла (если удалось получить) в формате _md5_<строка md5>
- если $add_hash равен 'sha1' - sha1 файла (если удалось получить) в формате _sha1_<строка sha1>
- Код: Выделить всё
openssl enc -d -aes-256-cbc -salt -pass pass:mypass -in myfile.zip.enc -out myfile.zip
- Код: Выделить всё
@echo off
for %%i in (*.zip.enc) do openssl enc -d -aes-256-cbc -salt -pass pass:mypass -in %%i -out %%~ni
Под 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"
VII. Типовой пример (examlpe.class.b2yd.php)
- Код: Выделить всё
<?php
//
// [email protected] : Создание архива сайта и баз данных с выгрузкой на Яндекс Диск.
//
// 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 отправителя (если опущен или пустой - '[email protected]')
'email_from' => '[email protected]',
// Имя отправителя (если опущено или пустое - b2yd)
'email_fromname' => 'myname',
// Адрес получателей, массив
'email_to' => array('[email protected]', '[email protected]'),
// Адрес ответа (если опущен или пустой - данные берутся из $email_from)
'email_replyto' => '[email protected]',
// Адрес копии (если опущен или пустой - нет)
//'email_cc' => '[email protected]',
// Адрес скрытой копии (если опущен или пустой - нет)
//'email_bcc' => '[email protected]',
// Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
// Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
'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 отправителя (если опущен или пустой - '[email protected]')
'email_from' => '[email protected]',
// Имя отправителя (если опущено или пустое - b2yd)
'email_fromname' => 'myname',
// Адрес получателей, массив
'email_to' => array('[email protected]', '[email protected]', '[email protected]'),
// Адрес ответа (если опущен или пустой - данные берутся из $email_from)
'email_replyto' => '[email protected]',
// Адрес копии (если опущен или пустой - нет)
//'email_cc' => '[email protected]',
// Адрес скрытой копии (если опущен или пустой - нет)
//'email_bcc' => '[email protected]',
),
),
// Бэкапы
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
//
// [email protected] : Создание архива сайта и баз данных с выгрузкой на Яндекс Диск.
//
// 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',
// Создать списки файлов вместо бэкапа (если задан и нулевой) или обработать очередной фрагмент списка (если задан и ненулевой)
'backup_list' => $list,
// Максимальный размер несжатых файлов для архива файлов в одном списке (по умолчанию 100 МБ)
'backup_max' => $max,
),
);
$notice =
// Уведомления
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 отправителя (если опущен или пустой - '[email protected]')
'email_from' => '[email protected]',
// Имя отправителя (если опущено или пустое - b2yd)
'email_fromname' => 'myname',
// Адрес получателей, массив
'email_to' => array('[email protected]', '[email protected]'),
// Адрес ответа (если опущен или пустой - данные берутся из $email_from)
'email_replyto' => '[email protected]',
// Адрес копии (если опущен или пустой - нет)
//'email_cc' => '[email protected]',
// Адрес скрытой копии (если опущен или пустой - нет)
//'email_bcc' => '[email protected]',
// Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
// Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
'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
);
?>
IX. Типовой пример уведомления (по e-mail или на форуме phpBB3)
См. примеры в этой теме форума. Текст уведомлений разных типов идентичен. При необходимости получения SMS по выполнению бэкапа можно воспользоваться сервисами mail.ru.
X. История версий
v1.0 : 20121216 : первый релиз
v1.1 : 20121217 : стабильный релиз ( viewtopic.php?f=41&t=56 )
v1.2 : 20121218 : добавлено:- выгрузка на ftp-сервер,
- отправка на e-mail,
- путь к корневой папке в файловых архивах и др.
- балансировка нагрузки,
- преодоление проблем с masterhost.ru и др.
- уведомление на e-mail,
- дополнительные исправления внешних библиотек и др.
v.2.0.1 : 20121223 : стабильный релиз
v.2.0.2 : 20121224 : добавлено:- отправка e-mail посредством mail()
- стабильный релиз
- дробление архивов на части (учет ограничения хостинга по размеру файлов)
- стабильный релиз
- уведомление на форумах phpbb3
- исправление мелких ошибок
- стабильный релиз
v.2.0.6 : 20130106 : исправление ошибок с кодировкой mysql: файл дампа принудительно кодируется в $backup_db_charset
v.2.0.7 : 20130107 : исправление ошибок с дампом mysql (пустая запись INSERT TO table VALUES ;), стабильный релиз
v.2.0.8 : 20130109 : добавлено:- массив логинов Яндекс Диск - хранилища выбираются последовательно для каждого нового бэкапа, что позволяет избавиться от ограничений размера, подключив несколько штук
- изменения в web_dav_client - Яндекс Диск иногда очень долго отдаёт список файлов каталога
- стабильный релиз
- исправление мелких ошибок
- sha1 вместо md5 или отключение hash в суффиксе имени файла (см. $add_hash)
- простое шифрование файла архива по алгоритму aes-256-cbc + salt, совместимое с openssl
v.2.1.1 : 20130117 : рефакторинг
v.2.1.2 : 20130127 : обновление phpBB.class.php
v.2.1.3 : 20130203 : обновление phpBB.class.php, добавлена возможность пропуска больших файлов, если их размер больше $backup_skip_large байт
Техническая поддержка:
- оказывается на этом форуме в этой теме
- бесплатная (в разумном объёме)
- только на русском языке.
Перевод комментариев исходных кодов на английский не планируется, ибо используется сервис российского происхождения.
Исходные коды как были и есть OpenSource, так ими и останутся. Просьба упоминать автора при использовании скрипта в своих разработках и по возможности давать ссылку на эту тему форума. Чем больше пользователей, тем больше возможностей довести софт до совершенства. Замечания и пожелания приветствуются.
Успешного использования !
Здесь располагаются ссылки на крайнюю версию (стабильный релиз). Если кому-то требуются предыдущие, пишите, пожалуйста, свои запросы в этой теме.
Скачать с форума: Скачать с Яндекс Диска : b2yd_v_2_1_3.zip