2009-04-10 12 views
5

¿Cuál es la mejor manera de hacer esto para PHP? ¿Hay alguna función de PHP que pueda hacer esto, considerando que el contenido de la columna podría ser muy grande?¿Cómo hacer texto DIFF usando PHP?

Si la función de PHP no está disponible, ¿a qué utilidad de shell puedo llamar?

gracias

Respuesta

4

El proceso habitual consiste en almacenar cada revisión distinta y calcular el diff cuando el usuario quiere ver, tal vez el almacenamiento en caché de salida que si el proceso es costoso.

Puede almacenar una revisión base, y luego tener un conjunto de diferencias que se pueden aplicar para obtener versiones anteriores.

En cualquier caso, hay una concesión que se hará; la primera opción hace que la recuperación de versiones específicas sea económica, a cambio de un poco más de procesamiento requerido para diferir; el segundo hace que la visualización de diferencias sea barata, pero a costa de un parche incremental potencialmente costoso para obtener una versión específica.

+1

Pero, ¿cómo hacer el DIFF en primer lugar? ¿PHP tiene alguna función incorporada? –

10

no hay funciones integradas en PHP. pero, hurra para PEAR: Text_Diff (nunca lo usé difícil, pero en PEAR confío).

e incluso hay un paquete PECL, xdiff

pista: clases de pera son pura php, paquetes PECL son módulos. normalmente, los módulos son más rápidos que las clases, pero también depende de la funcionalidad. solo tienes que probar y evaluar.

para almacenar: almacenaría el texto sin formato, no los diffs. el espacio es barato, muchas bases de datos (por ejemplo, mysql) admiten la compresión de datos (o puede descomprimir en php), pero si almacena el texto sin formato, usted es independiente del algoritmo diff y puede cambiarlo más adelante si es necesario.

si necesita velocidad, puede almacenar tanto los textos impresos como los diffs.

+0

+1: He usado Text_Diff en el pasado y hace el trabajo. –

+0

@PaoloBergantino ¿Puedes dar un ejemplo de código? – hitautodestruct

+0

Puede ver [aquí] (https://pear.php.net/manual/en/package.text.text-diff.intro.php) que 'Text_Diff' puede usar' xdiff'. @hitautodestruct puede encontrar ejemplos en: https://pear.php.net/manual/en/package.text.text-diff.intro.renderers.php – Keelan

0

Si el contenido es muy grande y los cambios son solo menores, puede optar por un enfoque de "delta inverso": solo la última versión del texto se almacena en formato completo, y la versión anterior es una diferencia de la última versión a la anterior.

Se ahorraría mucho espacio de almacenamiento, pero al comparar dos versiones donde el número de modificaciones es grande, el costo del proceso podría ser considerable. Después de todo, siempre es una compensación entre el espacio de almacenamiento y los requisitos de procesamiento.

Si no puede o no quiere usar PEAR y PECL, aún puede usar la utilidad diff llamada por exec. Preferiría un formato estándar de diff, y nunca desarrollar uno propio.

Cuestiones relacionadas