Вопрос надежного резервного копирования сайта WordPress актуален для каждого администратора. Многие предпочитают использовать плагины, однако иногда это нежелательно — например, из-за ограничений по ресурсам или для повышения безопасности. В этой статье мы подробно рассмотрим, как создать автоматический бэкап WordPress без плагинов, используя стандартные инструменты сервера и PHP-скрипты. Это позволит сделать процесс максимально контролируемым и легким в настройке.
Почему стоит создавать бэкапы WordPress без плагинов
Использование плагинов для бэкапов — удобный способ, но есть ряд причин, по которым можно отказаться от них:
- Производительность: плагины могут замедлять работу сайта, создавая дополнительную нагрузку.
- Безопасность: сторонний код — это потенциальная точка уязвимости.
- Контроль и гибкость: собственные скрипты дают полный контроль над процессом и позволяют интегрировать бэкапы в существующие процессы.
Поэтому рассмотрим подход с помощью PHP и cron.
Использование cron для автоматического запуска бэкапов
Для начала необходимо настроить планировщик задач cron на сервере — это позволит запускать скрипт с нужной периодичностью.
Например, чтобы запускать резервное копирование каждый день в 3 часа ночи, добавьте в cron следующую строку:
0 3 * * * /usr/bin/php /путь/к/вашему/скрипту/wpkey-backup.php
Где /usr/bin/php — путь к интерпретатору PHP на сервере, а /путь/к/вашему/скрипту/wpkey-backup.php — путь к вашему PHP-скрипту для бэкапа.
Если у вас нет доступа к cron, можно использовать аналогичные сервисы планирования задач, например, на хостинге или внешние cron-сервисы.
Создание PHP-скрипта для резервного копирования базы данных и файлов
Основные задачи при создании бэкапа — это сохранение базы данных и файлов сайта.
Резервное копирование базы данных
Для экспорта базы данных можно использовать команду mysqldump, вызванную из PHP, либо сделать дамп средствами PHP.
Пример использования exec в PHP для создания дампа:
function wpkey_create_db_backup() {
$db_user = 'DB_USER';
$db_password = 'DB_PASSWORD';
$db_name = 'DB_NAME';
$backup_file = __DIR__ . '/backup/db-backup-' . date('Y-m-d_H-i-s') . '.sql';
$command = "mysqldump -u {$db_user} -p'{$db_password}' {$db_name} > {$backup_file}";
exec($command, $output, $return_var);
return ($return_var === 0) ? $backup_file : false;
}
Важно заменить DB_USER, DB_PASSWORD и DB_NAME на реальные данные. Если exec запрещён, можно использовать mysqli для выгрузки данных, но это сложнее.
Резервное копирование файлов сайта
Для копирования файлов сайта оптимально упаковать их в архив ZIP. Пример создания архива ZIP в PHP:
function wpkey_create_files_backup($source_dir) {
$zip_name = __DIR__ . '/backup/files-backup-' . date('Y-m-d_H-i-s') . '.zip';
$zip = new ZipArchive();
if ($zip->open($zip_name, ZipArchive::CREATE) !== TRUE) {
return false;
}
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($source_dir),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($source_dir) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
return $zip_name;
}
В переменную $source_dir передайте путь к корню вашего сайта, например, __DIR__ . '/../'.
Объединяем всё в один скрипт и отправляем бэкапы на почту или облако
Теперь объединим функции и добавим отправку архива на email или загрузку в облако (например, Dropbox, Google Drive), либо просто сохраняем на сервере.
Пример простого объединённого скрипта с отправкой email:
function wpkey_send_backup_email($file_path) {
$to = 'youremail@example.com';
$subject = 'WordPress Backup ' . date('Y-m-d');
$message = 'В приложении резервная копия сайта.';
$headers = "From: wpkey-backup@example.com\r\n";
$file_content = chunk_split(base64_encode(file_get_contents($file_path)));
$separator = md5(time());
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"\r\n";
$body = "--" . $separator . "\r\n";
$body .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
$body .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$body .= $message . "\r\n";
$body .= "--" . $separator . "\r\n";
$body .= "Content-Type: application/octet-stream; name=\"" . basename($file_path) . "\"\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "Content-Disposition: attachment\r\n\r\n";
$body .= $file_content . "\r\n";
$body .= "--" . $separator . "--";
return mail($to, $subject, $body, $headers);
}
// Основной код
$backup_dir = __DIR__ . '/backup';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
$db_backup = wpkey_create_db_backup();
$files_backup = wpkey_create_files_backup(__DIR__ . '/../');
if ($db_backup) {
wpkey_send_backup_email($db_backup);
}
if ($files_backup) {
wpkey_send_backup_email($files_backup);
}
Обратите внимание, что отправка больших файлов по email может не сработать из-за ограничений почтового сервера. В этом случае лучше настроить загрузку в облако с помощью API.
Рекомендации по безопасности и хранению бэкапов
При создании бэкапов без плагинов обязательно следите за безопасностью:
- Храните бэкапы за пределами публичной директории сайта или защитите их .htaccess.
- Ограничьте права доступа к папке с бэкапами.
- Регулярно удаляйте старые резервные копии, чтобы не занимать много места.
- Проверяйте корректность восстановления из резервных копий.
Также можно настроить уведомления о выполнении бэкапа и ошибок.
Альтернативные решения: плагины для резервного копирования
Если вы всё же решите использовать плагины, советуем обратить внимание на проверенные инструменты, которые оптимизированы и поддерживаются:
- Clearfy Pro — комплексное решение для оптимизации и безопасности, включает функции резервного копирования.
- UpdraftPlus — популярный плагин для резервного копирования с возможностью загрузки в облако.
- WP-DB-Backup — простой плагин для сохранения базы данных.
Используйте плагины, если хотите получить готовое решение без необходимости писать код и настраивать cron.