Автоматическое создание резервных копий сайта – одна из ключевых задач для любого администратора WordPress. Обычно для этого используются плагины, но на крупных или кастомных проектах иногда важно обойтись без лишних расширений, чтобы снизить нагрузку и избежать конфликтов. В этой статье мы рассмотрим, как создать систему автоматического резервного копирования WordPress своими силами, используя PHP-скрипты и планировщик задач Cron. Такой подход даст полный контроль над процессом и позволит гибко настроить резервное копирование.
Почему стоит делать резервные копии вручную, без плагинов
Плагины резервного копирования, например UpdraftPlus или BackWPup, популярны и функциональны, но имеют ряд ограничений и недостатков:
- Дополнительная нагрузка на сервер – плагин запускает тяжелые процессы прямо из WordPress.
- Потенциальные проблемы с совместимостью и обновлениями.
- Ограниченные возможности кастомизации.
Создавая собственное решение, вы сможете:
- Автоматизировать процесс на уровне сервера, не нагружая WordPress.
- Настроить индивидуальный набор файлов и баз данных для резервного копирования.
- Интегрировать отправку копий на удаленные хранилища (FTP, облака).
Настройка скрипта резервного копирования базы данных WordPress
Первым шагом будет создание PHP-скрипта, который выгружает базу данных в SQL-файл. Для этого понадобится доступ к учетным данным базы из файла wp-config.php. Рассмотрим пример функции, которая создаст резервную копию базы и сохранит ее в папке wp-content/backups:
<?php
function wpdirect_backup_database() {
require_once __DIR__ . '/wp-config.php';
$backup_dir = __DIR__ . '/wp-content/backups';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
$date = date('Y-m-d_H-i-s');
$filename = $backup_dir . "/db_backup_{$date}.sql";
$command = "mysqldump --user={$DB_USER} --password={$DB_PASSWORD} --host={$DB_HOST} {$DB_NAME} > {$filename}";
exec($command, $output, $return_var);
if ($return_var !== 0) {
error_log("[WPDIRECT] Ошибка создания резервной копии базы данных.");
return false;
}
return $filename;
}Обратите внимание, что для работы функции на сервере должна быть доступна утилита mysqldump. В случае Windows можно использовать альтернативные методы через PHP (например, экспорт через mysqli), но они менее эффективны.
Объяснение кода
Мы считываем параметры подключения из wp-config.php, создаем папку backups при необходимости, формируем имя файла с датой и временем. Затем вызываем команду mysqldump для создания дампа базы. Ошибки записываем в лог.
Создание архива с файлами сайта WordPress
Резервная копия только базы — это хорошо, но без файлов темы, плагинов и медиа-контента сайт восстановить нельзя. Для этого создадим функцию, которая запакует все нужные каталоги в архив ZIP:
function wpdirect_backup_files() {
$root_dir = __DIR__;
$backup_dir = $root_dir . '/wp-content/backups';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
$date = date('Y-m-d_H-i-s');
$zip_path = $backup_dir . "/files_backup_{$date}.zip";
$zip = new ZipArchive();
if ($zip->open($zip_path, ZipArchive::CREATE) !== TRUE) {
error_log("[WPDIRECT] Не удалось создать архив резервной копии файлов.");
return false;
}
$dirs_to_backup = ['wp-content/uploads', 'wp-content/themes', 'wp-content/plugins'];
foreach ($dirs_to_backup as $dir) {
$path = $root_dir . '/' . $dir;
if (is_dir($path)) {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
foreach ($files as $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($root_dir) + 1);
$zip->addFile($filePath, $relativePath);
}
}
}
}
$zip->close();
return $zip_path;
}В этом примере мы архивируем только ключевые каталоги с пользовательскими данными и кодом. При необходимости можно расширить список или включить весь корень сайта.
Автоматизация запуска резервного копирования через Cron
Чтобы резервные копии создавались регулярно, нужно настроить системный планировщик задач Cron. Для этого создайте отдельный PHP-файл, например backup-wpdirect.php в корне сайта с таким содержимым:
<?php
require_once __DIR__ . '/wp-config.php';
// Вызов функций резервного копирования
$dbBackup = wpdirect_backup_database();
$filesBackup = wpdirect_backup_files();
if ($dbBackup && $filesBackup) {
error_log("[WPDIRECT] Резервная копия сайта создана: база - {$dbBackup}, файлы - {$filesBackup}");
} else {
error_log("[WPDIRECT] Ошибка создания резервных копий.");
}Для запуска этого файла по расписанию добавьте в Cron следующую строку (пример для запуска в 3:00 каждую ночь):
0 3 * * * /usr/bin/php /path/to/your/site/backup-wpdirect.php<Замена /path/to/your/site/ на реальный путь к сайту.
Отправка резервных копий на удаленный сервер или облако
Чтобы повысить надежность, рекомендуется копии сразу же копировать на внешний сервер или облачное хранилище. Рассмотрим пример отправки архива по FTP:
function wpdirect_upload_backup_ftp($filePath) {
$ftp_server = 'ftp.example.com';
$ftp_user = 'username';
$ftp_pass = 'password';
$remote_dir = '/backups/';
$conn_id = ftp_connect($ftp_server);
if (!$conn_id) {
error_log('[WPDIRECT] Не удалось подключиться к FTP-серверу');
return false;
}
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
if (!$login_result) {
error_log('[WPDIRECT] Ошибка авторизации на FTP-сервере');
ftp_close($conn_id);
return false;
}
ftp_pasv($conn_id, true);
// Создаем удаленную папку, если не существует
@ftp_mkdir($conn_id, $remote_dir);
$remote_file = $remote_dir . basename($filePath);
if (ftp_put($conn_id, $remote_file, $filePath, FTP_BINARY)) {
error_log("[WPDIRECT] Файл {$filePath} успешно загружен на FTP");
ftp_close($conn_id);
return true;
} else {
error_log("[WPDIRECT] Ошибка загрузки файла {$filePath} на FTP");
ftp_close($conn_id);
return false;
}
}Эту функцию можно вызывать после создания резервной копии, чтобы автоматически выгружать её на удаленный сервер.
Советы по безопасности и хранению резервных копий
При работе с резервными копиями важно учитывать следующие моменты:
- Защищайте папку с бэкапами от доступа через веб. Можно добавить файл
.htaccessс правилами запрета. - Регулярно очищайте старые резервные копии, чтобы не занимать много места.
- Используйте шифрование при передаче и хранении копий, особенно если данные конфиденциальны.
- Тестируйте восстановление из резервных копий, чтобы убедиться в их работоспособности.
Интеграция с WPShop: автоматизация и расширенные возможности
Если вы используете решения WPShop, например, плагин Clearfy Pro, можно дополнительно оптимизировать работу сайта и интегрировать собственные задачи резервного копирования с его функционалом. Clearfy, например, содержит инструменты для оптимизации, которые помогут снизить нагрузку во время создания бэкапов.
Также для управления задачами и уведомлениями можно использовать сервисы и плагины из каталога WPShop, например, WPRemark для уведомления администраторов о статусе резервного копирования.