Инструкции по восстановлению информации в PHP

Раздел: Администрирование PHP -> Восстановление данных

Восстановление данных в PHP: обзор подходов

Как выполнить автоматическое восстановление базы данных MySQL из последнего дампа с помощью PHP?

Самый надёжный способ восстановления данных в PHP - импорт резервной копии MySQL средствами самого PHP. Этот метод подходит для регулярного восстановления после сбоев или для развёртывания проектов.

Пример скрипта, который находит последний дамп в директории и выполняет его импорт:


<?php
$backupDir = '/var/backups/mysql/';
$files = glob($backupDir . '*.sql');
if (!$files) {
    die('Резервные копии не найдены.');
}
// Сортируем по времени изменения, берём последний
usort($files, function($a, $b) {
    return filemtime($b) - filemtime($a);
});
$latestBackup = $files[0];

$command = sprintf(
    'mysql -u %s -p%s %s < %s',
    escapeshellarg($dbUser),
    escapeshellarg($dbPass),
    escapeshellarg($dbName),
    escapeshellarg($latestBackup)
);
$output = shell_exec($command . ' 2>&1');
echo 'Импорт завершён.';
?>

Bitrix restore php (восстановление данных в битрикс на php)

Пояснения шагов:

  1. glob() собирает все .sql файлы.
  2. usort сортирует по дате изменения (самый свежий ставится первым).
  3. Формируется команда mysql с экранированием данных.
  4. shell_exec выполняет импорт.

Возможные проблемы и их решение:

  • Нет доступа к shell - используйте PDO или mysqli для построчного выполнения SQL.
  • Пароль содержит спецсимволы - обязателен escapeshellarg.
  • Большой дамп - разбивайте на части или увеличьте max_execution_time.

Цель использования: периодическое восстановление целостности БД, миграция на новый сервер.

Как восстановить сериализованные данные PHP после изменения длины строк в объекте?

При изменении структуры класса может нарушиться сериализованная строка. Решение - ручная подстройка длины в строке сериализации или использование рекурсивного парсера.


<?php
function fixSerialized($data) {
    $pattern = '/s:(\d+):"(.*?)";/s';
    return preg_replace_callback($pattern, function($matches) {
        $correctLen = strlen($matches[2]);
        return 's:' . $correctLen . ':"' . $matches[2] . '";';
    }, $data);
}

$corrupted = 'O:8:"stdClass":1:{s:3:"key";s:5:"value";}';
$fixed = fixSerialized($corrupted);
$obj = unserialize($fixed);
print_r($obj);
?>

Restore php (восстановление данных в php)

stdClass Object
(
    [key] => value
)

Проблема: несоответствие длины строки может вызвать ошибку unserialize. Используйте preg_replace_callback с корректным подсчётом символов. Также полезно проверять кодировку (UTF-8).

Цель: восстановление старых сессий, кеша, объектов из БД после изменения классов.

Как восстановить данные из повреждённого JSON-файла с помощью PHP?

Если JSON файл повреждён (потеряна запятая, кавычка), можно попробовать исправить структуру с помощью регулярных выражений или использовать библиотеки-парсеры с восстановлением.


<?php
$brokenJson = '{"name": "John", "age": 30, "city": "New York"'; // не хватает }
// Простейшая попытка восстановить
$fixed = $brokenJson . '}';
$data = json_decode($fixed, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    // Более сложный парсинг с игнорированием ошибок
    $data = json_decode($brokenJson, true, 512, JSON_INVALID_UTF8_IGNORE | JSON_PARTIAL_OUTPUT_ON_ERROR);
}
print_r($data);
?>
Array
(
    [name] => John
    [age] => 30
    [city] => New York
)

Проблема: json_decode может возвращать null. Используйте JSON_PARTIAL_OUTPUT_ON_ERROR и JSON_INVALID_UTF8_IGNORE. Для более сложных случаев применяйте библиотеку „halaxa/json-machine“ с восстановлением отсутствующих частей.

Цель: восстановление конфигурационных файлов, обмена данными с внешними системами.

Как восстановить данные из логов PHP (error log) для анализа утерянных переменных?

Логи PHP могут содержать дампы переменных (print_r, var_dump), которые не были сохранены. Извлечение данных возможно с помощью парсинга регулярными выражениями.


<?php
$logContent = file_get_contents('/var/log/php_errors.log');
preg_match_all('/\[dump\] (.*?)\[/s', $logContent, $matches);
$dumps = $matches[1];
foreach ($dumps as $dump) {
    // Попытка восстановить сериализованный объект
    $data = @unserialize($dump);
    if ($data === false) {
        // Или просто сохраняем как текст
        echo 'Найден дамп: ' . substr($dump, 0, 100) . PHP_EOL;
    }
}
?>

Проблема: логи могут быть перемешаны с другими сообщениями. Уточняйте паттерн поиска. Также не забывайте про кодировку.

Цель: восстановление утерянных данных при отладке, если в лог была выведена информация.

Расширенные примеры восстановления данных в PHP

Пример 1. Восстановление базы данных из нескольких файлов дампов с прогрессом

Скрипт обрабатывает все .sql файлы в директории, импортирует каждый и показывает прогресс в консоли.

Пример

<?php
$dir = '/backups/';
$files = glob($dir . '*.sql');
$total = count($files);
foreach ($files as $i => $file) {
    echo "[$i/$total] Импорт $file...\n";
    $cmd = sprintf(
        'mysql -u%s -p%s %s < %s',
        escapeshellarg($user),
        escapeshellarg($pass),
        escapeshellarg($db),
        escapeshellarg($file)
    );
    system($cmd, $ret);
    if ($ret !== 0) {
        file_put_contents('restore_errors.log', "Ошибка при импорте $file\n", FILE_APPEND);
    }
}
echo 'Восстановление завершено.';
?>
[0/2] Импорт /backups/dump_2025.sql...
[1/2] Импорт /backups/dump_2026.sql...
Восстановление завершено.

Пример 2. Восстановление сериализованного объекта с вложенными свойствами

Если класс изменён (добавлено поле), сериализованный объект может не прочитать новые поля. Применяется рекурсивная замена идентификаторов класса.

Пример

<?php
class OldClass {
    public $name;
}
class NewClass {
    public $name;
    public $extra;
}

$serializedOld = serialize(new OldClass());
// Заменим имя класса
$serializedNew = str_replace('OldClass', 'NewClass', $serializedOld);
$object = unserialize($serializedNew);
$object->extra = 'добавлено'; // теперь объект работоспособен
print_r($object);
?>
NewClass Object
(
    [name] =>
    [extra] => добавлено
)

Пример 3. Восстановление данных из файла сессий PHP

Если сессии хранятся в файлах, можно прочитать сериализованные данные напрямую.

Пример

<?php
$sessionId = 'abcd1234';
$sessionFile = session_save_path() . '/sess_' . $sessionId;
if (file_exists($sessionFile)) {
    $data = file_get_contents($sessionFile);
    session_decode($data);
    $session = $_SESSION;
    print_r($session);
}
?>
Array
(
    [user_id] => 42
    [token] => 'a1b2c3'
)

Пример 4. Восстановление конфигурации из .env.example с заменой placeholder-ов

Если .env был утерян, можно восстановить его из .env.example, подставив значения из резервной копии или запросив у пользователя.

Пример

<?php
$example = file_get_contents('.env.example');
$replaces = [
    'DB_PASSWORD' => 'секрет123',
    'APP_KEY' => 'base64:...'
];
foreach ($replaces as $key => $value) {
    $example = preg_replace('/^' . $key . '=.*/m', "$key=$value", $example);
}
file_put_contents('.env', $example);
echo '.env восстановлен.';
?>
.env восстановлен.

Восстановление данных в PHP - comments

En
Restore php (php)