Делтифицированный контроль версий документа в PHP

Если у меня есть приложение PHP, которое позволяет пользователям вносить изменения в документы, как лучше всего реализовать отслеживание изменений для каждого документа? Я хочу, чтобы хранилище каждой ревизии было разделено (то есть сохраняло только внесенные изменения), как svn и другие SCM с кодом. Я знаю на очень простом уровне, как это работает, но когда я начинаю думать о его реализации, я немного запутываюсь.

Прежде всего, мне интересно, есть ли библиотека, которая может мне в этом помочь, так что мне не нужно полностью сворачивать свою собственную.

И мне интересно: следует ли мне сохранять полный текст только исходного документа, а затем сохранять только изменения, или мне следует сохранять полный текст последнего документа, и каждый раз, когда он изменяется, сохранять различия как одно из старые версии?

Если первое, то когда я хочу захватить страницу для отображения на сайте, нужно ли мне начинать с самого начала, а затем рекурсивно обновлять данные на основе исправлений, пока я не достигну текущей версии? Разве это не будет мучительно медленным, когда будет много исправлений?

Как я могу выполнять операции типа diff / patch в PHP, чтобы упростить удаление и реконструкцию страниц?

Стоит ли блокировать страницы, когда они их редактируют? Или позволить страницам войти в «состояния конфликта» и выполнить операции по разрешению конфликтов - позволить двум пользователям одновременно изменять одну и ту же страницу, если они изменяют разные части и т. Д. - Я схожу с ума, думая о том, насколько это будет сложно. Ах!


person Carson Myers    schedule 16.12.2009    source источник


Ответы (2)


Этот предыдущий вопрос SO может помочь.

person Amber    schedule 16.12.2009
comment
спасибо, это поможет с диффом, а как насчет сематики хранения ревизий? - person Carson Myers; 16.12.2009
comment
Я настоятельно рекомендую хранить последнюю версию целиком, а затем сохранять историю в виде различий. В противном случае вы столкнетесь с огромным узким местом производительности при обслуживании текущей версии (которая, вероятно, будет большинством ваших запросов). - person Amber; 16.12.2009
comment
Кроме того, что касается разрешения конфликтов - я бы использовал ту же систему, которую использует Mediawiki. Следите за тем, когда пользователь начал редактировать страницу и когда последний раз редактировался документ. Если время последнего редактирования наступило позже, чем пользователь начал редактирование, когда пользователь переходит к сохранению, покажите ему страницу конфликта, на которой есть как новая версия, так и их отредактированная версия, и потребовать от них либо отменить сохранение, либо отредактировать новую версию, чтобы добавить в свои изменения. Его довольно просто реализовать, и пользователю гораздо проще работать с ним. - person Amber; 16.12.2009

Почему бы вам не использовать сервер подрывной деятельности? Вы можете получить доступ к клиенту из консоли, используя exec() или аналогичный. На самом деле не стоит реализовывать что-то подобное с нуля, если только вы не пишете программу для пересмотра.

person soulmerge    schedule 16.12.2009
comment
это будет похоже на то, что делают википедия и другие вики-сайты. Я считаю, что есть способ сделать это и в wordpress, это для CMS. Я хочу, чтобы вся система существовала на одном сервере и имела как можно меньше зависимостей, поскольку она будет распространяться - person Carson Myers; 16.12.2009