Как сделать текстовый DIFF с помощью PHP?

Каков наилучший способ сделать это для 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. Я бы выбрал стандартный формат разметки и никогда не разрабатывал собственный.