Инструкции по восстановлению информации в 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)
Пояснения шагов:
- glob() собирает все .sql файлы.
- usort сортирует по дате изменения (самый свежий ставится первым).
- Формируется команда mysql с экранированием данных.
- 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 восстановлен.