Каков наилучший способ сделать это для PHP? Есть ли какая-либо функция PHP, которая может это сделать, учитывая, что содержимое столбца может быть очень большим?
Если функция PHP недоступна, какую утилиту я могу вызвать?
благодаря
в PHP нет встроенных функций diff. но, ура для PEAR: Text_Diff (никогда не использовал его жестко, но в PEAR i trust).
и есть даже пакет PECL, xdiff
Подсказка: классы груши – это чистые php, пакеты pecl – это модули. обычно модули быстрее, чем классы, но это также зависит от функциональности. вам просто нужно проверить и оценить.
для хранения: я бы сохранил простой текст, а не diff. пространство дешево, многие базы данных (например, mysql) поддерживают сжатие данных (или вы можете декомпрессировать в php), но если вы храните открытый текст, вы не зависите от алгоритма diff и можете изменить его позже, если это необходимо.
если вам нужна скорость, вы можете сохранить как текстовые, так и разностные.
Обычный процесс состоит в том, чтобы хранить каждую отдельную ревизию и вычислять diff, когда пользователь хочет ее просмотреть, возможно, кэширование этого вывода, если процесс стоит дорого.
Вы можете сохранить базовую ревизию, а затем установить набор различий, которые могут быть применены для получения предыдущих версий.
В любом случае есть уступка; первый вариант делает получение определенных версий недорогим, ценой немного большей обработки, требуемой для различения; второй делает diff просмотра дешевым, но ценой потенциально дорогого инкрементного исправления для получения конкретной версии.
Если контент очень велик, а изменения только незначительные, вы можете рассмотреть подход «обратного треугольника»: только последняя версия текста сохраняется в полном формате, а предыдущий вариант отличается от последнего версии к предыдущей.
Это избавило бы много места для хранения, но при сравнении двух версий, где количество модификаций велико, стоимость процесса может быть значительной. В конце концов, это всегда компромисс между объемом памяти и требованиями к обработке.
Если вы не можете или не хотите, чтобы пользователь PEAR и PECL, вы все равно можете использовать утилиту diff, вызванную exec. Я бы выбрал стандартный формат разметки и никогда не разрабатывал собственный.