Defenderyk
Уже пару раз ко мне обращались с подобной проблемой. Причина обнуления была та же - либо заканчивалось место на сервере, либо же на определённых этапах работы происходила нехватка выделенной оперативной памяти для PHP на сервере. Обработка подобных ситуаций с целью недопустить потерю данных довольно сложна и требует существенных затрат ресурсов, что скажется не самым лучшим образом на производительности. Более того, обработку файлов на PHP невозможно реализовать в виде единой операции (транзакции), соответственно и существенно затруднена возможность осуществления отката (отмены всех действий текущей транзакции) к предыдущей версии файловой базы данных при наступлении сбоя (без использования транзакционного подхода есть риск нарушения целостности базы данных: какие-то файлы будут обновлены, а какие-то нет, и в результате данные в них перестанут соответствовать друг другу)
alexx пишет:Может делать предварительную запись в буфер и если все окей, то файл записывается, как записался, буфер опустошается.
В PHP изначально запись на диск буферизируется. Но проблема в том, что практически все действия на форуме затрагивают не один файл, а как минимум несколько. И может оказаться так, что для первых файлов свободного пространства хватает, а для последнего нет. В итоге, даже если и восстановить содержимое последнего файла из буфера, оно не будет соответствовать обновлённым данным в первых файлах, а это уже нарушение целостности базы данных, о чём было сказано выше. Конечно, можно в специальных временных файлах либо буферах сохранять прежние версии файлов, но эта операция крайне расточительна с точки зрения расходованя ресурсов и производительность
vipraskrutka пишет:скорей всего по другой причине, файл открылся для записи, скрипт стер содержимое, тут бац, глюк апача (зависание, кончилась оперативка или перезагрузка) и остался наш файл пустым... Тут не спасет никакие защиты от обнуления...
Всё верно. PHP крайне абстрагирован от уровня оборудования (как и большинство языков программирования высокого уровня, а уж тем более интерпретируемых), поэтому диагностика и решение некоторых проблем на нём реализовать в принципе невозможно
alexx пишет:А как полетел, что случилось с форумом, вроде в обнулением проблема решена.
Решена была проблема с обнулением файлов при осуществлении множественного доступа к ним, про изменённый механизм блокировки файлов для осуществления множественного доступа упоминалось в теме релиза. Разумеется, проблемы и сбои на сервере к этому не относятся
Defenderyk
Во-первых, попробуй восстановить файл списка форумов из резервной копии, которая размещается в файле
data/allforums_bak.php, путём переименования этого файла в
allforums.php (при этом желательно сделать копию текущего файла, на случай если восстановление из резервной копии не принесёт желаемого результата).
Если восстановление из резервной копии не помогло, можно сделать следующее. Создай в админке новый раздел, заново укажи при этом название, описание, модераторов раздела и другие параметры, т.к. восстановить старые параметры без резервной копии нельзя. Далее всё просто, открой файл
data/allforums.php, по названию раздела найди его элемент в сериализованном массиве, он будет выглядеть примерно так:
Цитата:{i:1;a:18:{s:7:"catname";s:8:"Тестовая";s:5:"catid";i:1;s:4:"name";s:8:"Тестовый";s:2:"id";i:1;s:4:"desc";s:0:"";s:5:"posts";i:0;
s:6:"topics";i:0;s:8:"position";i:101;s:6:"stview";s:3:"all";s:5:"stnew";s:3:"all";s:5:"strep";s:3:"all";s:9:"moderator";a:1:{i:1;s:6:"yura3d";}s:7:"private";b:0;s:5:"codes";b:1;s:5:"polls";b:1;s:4:"icon";s:0:"";s:6:"upload";i:0;s:9:"last_time";i:0;}
Красным отмечен номер (id) созданного раздела, теперь нужно заменить этот id номером старого раздела (в 2-х выше отмеченных местах). На этом всё, теперь осталось привести в порядок статистику раздела, для этого в админке напротив него кликаем сначала
Восстановить темы, а затем
Пересчитать. Если раздел был приватным, то ранее назначенные для доступа к нему пользователи сохраняют свои права
Вообще, где-то у меня была утилита для автоматизации описанных выше процессов, но сейчас что-то не могу найти
Было бы неплохо включить её в архив 1-го сообщения темы