Serialize - восстановить не верно сериализованный файл

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
И не будет решена, так как ее, проблемы, не существует ни у кого, кроме вас. А репродуцирующий проблему код вы отказываетесь привести.
 

Serg Klyk

Новичок
Вот и нашлась ошибка, в конце строки более 500 кб, запись вида s:10:"097232".
Второй раз делаю кстати, написал простейший парсер и он сравнил данные с реальным размером переменной.
Прописал вместо 6 символов 10 и все ок. Здесь вряд ли с кодировкой дело, ведь цифр не 5 и не 20, тем более это цифры.

Но раз все говорите, что функция не боится кавычек, буду смотреть в другую сторону.
На заметку:
Первый раз с serialize был после бекапа, ftp настроен на режим ANSCI, а не бинарный по умолчанию, и он обратно заливал на сервер файл на пару байт меньше, что и сказывалось на функцию. Но здесь файл не изымался и не изменялся из вне.
 

Serg Klyk

Новичок
репродуцирующий проблему код вы отказываетесь привести.
А какой код, там простая функция открытия файла

PHP:
<?php
function ArrayOpenAAA($ArrayUrl) {
  $ArrayUrl = $ArrayUrl . ".DB.PHP";
  $F = file_get_contents($ArrayUrl);
  if (left($F, 6) == "<?PHP ") {$F = right($F, strlen($F) - 6);}
  if (right($F, 3) == " ?>") {$F = left($F, strlen($F) - 3);}
  if (!$F) { ErrorDB("Empty file", $ArrayUrl); }
  $F = unserialize($F);
  if (!$F) {
    // Backup current DB
    copy ($ArrayUrl, $ArrayUrl . ".".time().".backup");
    ErrorDB("Can't unserialize file", $ArrayUrl);
  }
  return $R;
}
?>
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Serg Klyk, ты можешь привести пример данных и кода, которые приводят к ошибке? А тупо serialize > результат > unserialize fail
 

Adelf

Administrator
Команда форума
Насколько я понял, у него крайне вредный ftp manager, который то кодировку в файле поменяет, то пару байтов удалит...
 

Serg Klyk

Новичок
Насколько я понял, у него крайне вредный ftp manager, который то кодировку в файле поменяет, то пару байтов удалит...
FileZilla по дефолту может искажать кавычки в текстовых файлах, если выбран режим передачи ASCII, тогда у вас файлы с кавычками сериализированные после перенесения на комп и обратно могут изменить размер, что именно удаляется/добавляется к кавычкам не помню. Но факт.
 

Serg Klyk

Новичок
Внимание! Опять проблема с SERIALIZE.
Тогда файл поврежден/изменен был кем то.
А сейчас файл полный, но не открывается.

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

AmdY

Пью пиво
Команда форума
выложи на gist файл посмотреть, а то у тебя какие-то волшебные проблемы и красные драконы кругом. дела бэкап этого файлика и т.д., чтобы избежать дел натворенный рукожопами.
 

Активист

Активист
Команда форума
Кто пишет файл? Проблема отсутствия блокировок при активном доступе крашит серилиазованные данные (известная проблема не использования локов). Например, при записи файла нужно использовать LOCK_EX (file_put_contents) или испольовать флаг эксклюзивной блокировки при fopen. А заливать на FTP нужно в бинарном режиме. Заливать с временным именем, а после заливки менять название файла на оригинальный командой FTP.
 

Serg Klyk

Новичок
Кто пишет файл?FTP.
Спасибо за идею. Но этот вариант исключен.
Функция работает отлично. Там типа Массив = ОперМассив() и функция сама, если не смогла сериализировать файл, то берет с бекапа.
А сохранение делает бекап постоянно. То есть, залив плохой файл, функция возвращает ошибку.

По сути: сохранение ведется с блокировкой, и на всякий еще и делается бекап.
Но тут то файл сохранен норм, видно что закр. скобки файла на месте. Они убираются при открытии файла, перед выдачей в унсериализе, для таких случаев, когда файл поврежден.
 
Сверху