Резервное копирование — одна из важнейших задач любого сайта на WordPress. Обычно для этого используют плагины, но иногда их установка невозможна или нежелательна. В этой статье рассмотрим, как настроить автоматическое создание резервной копии сайта WordPress с помощью PHP-скриптов и Cron, без использования дополнительных плагинов.
Почему важно создавать резервные копии WordPress
Резервные копии защищают ваш сайт от потери данных из-за ошибок, взломов, сбоев сервера или некорректных обновлений. Наличие актуальной резервной копии позволяет быстро восстановить работоспособность сайта без потери контента.
Хотя плагины для резервного копирования удобны, они могут повышать нагрузку на сайт и иногда конфликтовать с другими компонентами. Поэтому нередко для профессионалов важна возможность создать резервную копию самостоятельно, используя стандартные средства сервера.
Основные компоненты резервной копии WordPress
Резервная копия сайта должна включать:
- Файлы сайта — все файлы WordPress, темы, плагины, медиафайлы.
- Базу данных MySQL — все записи, записи пользователей, настройки и контент.
Отдельно рассмотрим, как получить резервную копию каждого компонента.
Создаем резервную копию файлов сайта с помощью PHP
Для создания архива файлов удобно использовать встроенные возможности PHP и расширение ZipArchive. Напишем функцию, которая создаст ZIP-архив корневой директории сайта.
function wpkpi_create_files_backup($source, $destination) {
if (!extension_loaded('zip') || !file_exists($source)) {
return false;
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
return false;
}
$source = realpath($source);
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($source),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($source) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
return file_exists($destination);
}Пример использования функции:
$backupFile = __DIR__ . '/backup-files-' . date('Y-m-d-H-i-s') . '.zip';
$sourceDir = __DIR__;
wpkpi_create_files_backup($sourceDir, $backupFile);Эта функция создает архив всех файлов сайта, кроме тех, что исключены системой. Можно дополнительно настроить фильтры для исключения больших папок, например, wp-content/cache.
Создаем резервную копию базы данных MySQL
Для резервного копирования базы данных используем команду mysqldump, запущенную из PHP через exec(). Для этого нужны параметры доступа к базе из wp-config.php:
define('DB_NAME', 'database_name_here');
define('DB_USER', 'username_here');
define('DB_PASSWORD', 'password_here');
define('DB_HOST', 'localhost');Создаем функцию для дампа базы в SQL-файл:
function wpkpi_create_db_backup($backupFile) {
require __DIR__ . '/wp-config.php';
$command = sprintf(
'mysqldump --user=%s --password=%s --host=%s %s > %s',
escapeshellarg(DB_USER),
escapeshellarg(DB_PASSWORD),
escapeshellarg(DB_HOST),
escapeshellarg(DB_NAME),
escapeshellarg($backupFile)
);
exec($command, $output, $return_var);
return $return_var === 0 && file_exists($backupFile);
}Использование функции:
$dbBackupFile = __DIR__ . '/backup-db-' . date('Y-m-d-H-i-s') . '.sql';
wpkpi_create_db_backup($dbBackupFile);Важно: сервер должен иметь доступ к mysqldump, а PHP должен разрешать запуск exec(). В некоторых хостингах это запрещено — тогда придется использовать другие методы.
Настраиваем автоматический запуск резервного копирования через Cron
Чтобы резервные копии создавались автоматически, настроим Cron-задачу на сервере. Создадим файл backup.php в корне сайта с таким содержимым:
<?php
// Создаем резервную копию файлов
$backupFile = __DIR__ . '/backup-files-' . date('Y-m-d-H-i-s') . '.zip';
wpkpi_create_files_backup(__DIR__, $backupFile);
// Создаем резервную копию базы данных
$dbBackupFile = __DIR__ . '/backup-db-' . date('Y-m-d-H-i-s') . '.sql';
wpkpi_create_db_backup($dbBackupFile);
// Функции здесь (или подключить из отдельного файла)
function wpkpi_create_files_backup($source, $destination) {
if (!extension_loaded('zip') || !file_exists($source)) {
return false;
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
return false;
}
$source = realpath($source);
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($source),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($source) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
return file_exists($destination);
}
function wpkpi_create_db_backup($backupFile) {
require __DIR__ . '/wp-config.php';
$command = sprintf(
'mysqldump --user=%s --password=%s --host=%s %s > %s',
escapeshellarg(DB_USER),
escapeshellarg(DB_PASSWORD),
escapeshellarg(DB_HOST),
escapeshellarg(DB_NAME),
escapeshellarg($backupFile)
);
exec($command, $output, $return_var);
return $return_var === 0 && file_exists($backupFile);
}
?>Затем добавим в Cron задачу, например, на ежедневное выполнение в 3 часа ночи:
0 3 * * * /usr/bin/php /path/to/wordpress/backup.php<Путь к PHP и скрипту замените на актуальные для вашего сервера.
Хранение и очистка старых резервных копий
Чтобы не захламлять сервер, нужно организовать удаление старых бэкапов. Добавьте в скрипт удаление файлов старше, например, 30 дней:
function wpkpi_cleanup_old_backups($dir, $days = 30) {
$files = glob($dir . '/backup-*');
$now = time();
foreach ($files as $file) {
if (is_file($file)) {
if ($now - filemtime($file) >= 60 * 60 * 24 * $days) {
unlink($file);
}
}
}
}
wpkpi_cleanup_old_backups(__DIR__, 30);Добавьте этот вызов в конец вашего backup.php, чтобы старые резервные копии автоматически удалялись.
Резервное копирование с отправкой на удаленный сервер или облако
Для повышения надежности полезно хранить копии не только локально, но и в облаке или на удаленном сервере. Для этого можно использовать FTP, SCP или API сервисов, например, Amazon S3.
Пример отправки файла по FTP:
function wpkpi_ftp_upload($localFile, $remoteFile) {
$ftp_server = 'ftp.example.com';
$ftp_user = 'username';
$ftp_pass = 'password';
$conn_id = ftp_connect($ftp_server);
if (!$conn_id) return false;
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
if (!$login_result) {
ftp_close($conn_id);
return false;
}
ftp_pasv($conn_id, true);
$upload = ftp_put($conn_id, $remoteFile, $localFile, FTP_BINARY);
ftp_close($conn_id);
return $upload;
}После создания бэкапа вызовите:
wpkpi_ftp_upload($backupFile, '/backups/' . basename($backupFile));
wpkpi_ftp_upload($dbBackupFile, '/backups/' . basename($dbBackupFile));Настройте параметры FTP под свои данные.
Полезные плагины для резервного копирования, если решите использовать готовые решения
Если в будущем нужна более простая настройка, обратите внимание на плагины:
- Clearfy Pro — многофункциональный плагин с возможностями оптимизации и управления сайтом, включая резервное копирование.
- WPRemark — надежный плагин для управления данными с поддержкой резервного копирования.
Использование плагинов подходит для пользователей, предпочитающих управлять резервными копиями из админки WordPress, но для большей гибкости лучше знать, как сделать это вручную.
Итоги и рекомендации
Создание автоматических резервных копий без плагинов позволяет получить полный контроль над процессом и снизить зависимость от сторонних разработчиков. Такой подход особенно актуален для профессиональных разработчиков и системных администраторов.
Обязательно тестируйте процесс восстановления из резервных копий, чтобы убедиться в их работоспособности. Также не забывайте о безопасности — храните бэкапы в защищенных местах и ограничивайте доступ к ним.