Нередко перед вебмастерами становится задача резервного копирования сайта. Но далеко не все системы управления имеют инструменты для выполнения данной операции.
Когда передо мной стала такая задача и не оказалось под рукой доступных инструментов в голову пришла мысль самому написать скрипт для бэкапа не только базы данных, но и всех файлов сайта.
В принципе операция резервного копирования файлов и базы данных элементарно осуществляется в ручную, как это делается читайте в блоге KtoNaNovenkogo.ru.
Приступим к написанию скрипта. Во первых определимся с функциями:
Делая резервную копию базы данных мы должны осознавать то, что нам может понадобиться не только содержимое таблиц — данные, но и сама структура. Тут нам поможет SQL-запрос:
SHOW CREATE TABLE `tablename`;
Кроме того всегда необходимо помнить про кодировку в которой хранятся данные в таблиах, ибо мы рискум получить иероглифы. С этой проблемой нам поможет справиться запрос.
SET NAMES charset
Естественно charset — используемая кодировка. Пример: "SET NAMES latin1".
Итак, мы будем работать с базой данный, соответственно должны задать параметры подключения к БД:
$host = "localhost"; // имя сервера $user = "root"; // имя пользователя $password = ""; // пароль $db_name = "site"; // имя базы данных
Дальше необходимо задать настройки самого скрипта:
$dump_dir = "/backup/"; // директория, куда будем сохранять резервный копии БД и файлов $dump_mail = "adminmail@site.ru"; // электронка, на которую будет отправлен backup-файл $filename = $db_name.".sql"; //файл дампа БД $source_dir = "/"; //директория, резервную копию которой будем сохранять $filezip = "arhiv.zip"; //архив бэкапа всех файлов и директорий
Подключаемся к базе данных:
$link = mysql_connect($host, $user, $password) or die( "Сервер базы данных не доступен" );//подключаемся к серверу БД $db = mysql_select_db($db_name) or die( "База данных не доступна" ); //выбираем базу данных
Основной код дампера:
mysql_query("SET NAMES utf8") or die( "Ошибка при выполнении запроса: ".mysql_error() ); $tables = "SHOW TABLES"; $res = mysql_query($tables) or die( "Ошибка при выполнении запроса: ".mysql_error() ); $fp = fopen( $dump_dir."/".$filename, "a" ); $dbc = "CREATE DATABASE IF NOT EXISTS `".$db_name."`"; fwrite ($fp, $dbc[1]."; USE ".$dbc[0]."; "); while( $table = mysql_fetch_row($res) ) { if ( $fp ) { $query = mysql_fetch_row(mysql_query("SHOW CREATE TABLE `".$table[0]."`")); fwrite ($fp, $query[1]."; "); $rows = 'SELECT * FROM `'.$table[0].'`'; $r = mysql_query($rows) or die("Ошибка при выполнении запроса: ".mysql_error()); while( $row = mysql_fetch_row($r) ) { $query = ""; foreach ( $row as $field ) { if ( is_null($field) ) $field = "NULL"; else $field = "'".mysql_escape_string( $field )."'"; if ( $query == "" ) $query = $field; else $query = $query.', '.$field; } $query = "REPLACE INTO `".$table[0]."` VALUES (".$query."); "; fwrite ($fp, $query); } } } fclose ($fp);
Теперь разберемся что тут происходит:
$tables = "SHOW TABLES"; // запрос на получение списка таблиц базы данных $res = mysql_query($tables); //выполняем запрос
Открываем файл для записи:
$fp = fopen( $dump_dir."/".$filename, "a" );
Дальше в цикле перебираем таблицы. В результате выполнения запроса:
"SHOW CREATE TABLE `".$table[0]."`"
получаем SQL-запрос создания таблицы и
fwrite ($fp, $query[1]."; ");
записываем его в файл. Далее получаем данные из таблицы и в файл записываем запрос на обновления данных в таблице.
$rows = 'SELECT * FROM `'.$table[0].'`'; $query = "REPLACE INTO `".$table[0]."` VALUES (".$query."); "; fwrite ($fp, $query);
Запись закончена, закрываем файл :
fclose ($fp);
Собственно дамп базы данных готов теперь нам нужно упаковать файлы в архив. Я использовал код работы с zip-архивами из статьи "Работа с zip архивами php, создание архиватора на php".
Для начала в файле php.ini необходимо раскомментировать строку extension=php_zip.dll, или убедиться что данное расширение включено у вас на хостинге, так как без него функции будут недоступны.
Привожу код архиватора, модифицированный под наши цели:
// Создаем архив и добавляем в него все файлы из директории $zip = new ZipArchive; if ($zip->open($dump_dir."/".$filezip, ZipArchive::CREATE) === true){ $allfiles = array(); recoursiveDir($source_dir); foreach ($allfiles as $key=>$val){ $zip->addFile($val); } $zip->close(); } function recoursiveDir($dir){ global $allfiles; if ($files = glob($dir.'/*')){ foreach($files as $file){ if (is_dir($file)){ recoursiveDir($file); }else{ $allfiles[] = $file; } } } }
Вот собственно и все, наш скрипт для создания резервной копии сайта готов. Теперь можно улучшить его добавив функцию отправки по e-mail. Готовое решение можете посмотреть в статье Михаила Русакова Отправка файла по e-mail на PHP.
Как организовать на php отправку e-mail с несколькими вложениями читайте тут.