2009-04-10 3 views
5

Qual è il modo migliore per farlo in PHP? C'è qualche funzione PHP che può fare questo, considerando che il contenuto della colonna potrebbe essere molto grande?Come fare il testo DIFF usando PHP?

Se la funzione PHP non è disponibile, quale utilità di shell è possibile chiamare?

grazie

risposta

4

Il processo è usuale per memorizzare ogni revisione distinto e calcolare il diff quando l'utente desidera visualizzare, forse caching che output se il processo è costoso.

È possibile memorizzare una revisione di base e quindi disporre di un set di diff che può essere applicato per ottenere versioni precedenti.

In entrambi i casi, è prevista una concessione; la prima opzione rende il recupero di versioni specifiche poco costose, al costo di un po 'più di elaborazione richiesta per la diffusione; il secondo rende la visualizzazione a basso costo, ma a costo di patch incrementali potenzialmente costose per ottenere una versione specifica.

+1

Ma come fare il DIFF in primo luogo? PHP ha funzioni integrate? –

10

non ci sono funzioni built in diff in PHP. ma, hooray per PEAR: Text_Diff (mai usato duro, ma in PERA mi fido).

e c'è anche un pacchetto PECL, xdiff

suggerimento: classi pera sono puri php, pacchetti PECL sono moduli. normalmente, i moduli sono più veloci delle classi, ma dipende anche dalla funzionalità. devi solo testare e valutare.

per la memorizzazione: memorizzerei il testo normale, non i diff. lo spazio è a buon mercato, molti database (ad esempio mysql) supportano la compressione dei dati (o si possono de/comprimere in php), ma se si archivia il testo in chiaro, si è indipendenti dall'algoritmo di diff e possono essere modificati in seguito, se necessario.

se avete bisogno di velocità, è possibile memorizzare sia i testi in chiaro che le differenze.

+0

+1: ho usato Text_Diff in passato e fa il lavoro. –

+0

@PaoloBergantino Puoi dare un esempio di codice? – hitautodestruct

+0

Puoi vedere [qui] (https://pear.php.net/manual/en/package.text.text-diff.intro.php) che 'Text_Diff' può usare' xdiff'. @hitautodestruct puoi trovare esempi su: https://pear.php.net/manual/en/package.text.text-diff.intro.renderers.php – Keelan

0

Se il contenuto è molto grande e le modifiche sono solo minori, si può prendere in considerazione l'approccio "reverse delta": solo la versione più recente del testo è memorizzata in formato completo e la versione precedente è una diff dalla versione più recente alla precedente.

Risparmierebbe molto spazio di archiviazione, ma confrontando due versioni in cui il numero di modifiche è elevato, il costo del processo potrebbe essere considerevole. Dopotutto, è sempre un compromesso tra spazio di archiviazione e requisiti di elaborazione.

Se non è possibile o non si desidera l'utente PEAR e PECL, è comunque possibile utilizzare l'utilità diff chiamata da exec. Preferirei sicuramente un formato diff standard e non svilupparne mai uno proprio.