Start · Sprachen · PHP · Referenz · xdiff_file_diff

xdiff_file_diff

Funktion

Erstellt einen Unified Diff zweier Dateien und schreibt das Ergebnis in eine Ausgabedatei.

seit PHP 0.2.0 Kategorie: misc

Signatur

xdiff_file_diff(string $old_file, string $new_file, string $dest, int $context = 3, bool $minimal = false): bool

Beschreibung

xdiff_file_diff() vergleicht zwei Textdateien miteinander und erzeugt einen sogenannten Unified Diff — das standardisierte Differenz-Format, das z. B. von patch, Git und vielen anderen Werkzeugen verstanden wird. Das Ergebnis wird direkt in die angegebene Zieldatei geschrieben.

Die Funktion gehört zur PECL-Erweiterung xdiff und basiert intern auf der libxdiff-Bibliothek. Sie ist besonders nützlich für Versionierungsaufgaben, Code-Review-Werkzeuge oder Deployment-Pipelines, bei denen Änderungen zwischen zwei Dateizuständen dokumentiert werden sollen.

Der Parameter context bestimmt, wie viele unveränderte Zeilen vor und nach jeder Änderung im Diff erscheinen — ein höherer Wert ergibt ausführlichere, aber leichter lesbare Patches. Mit minimal kann die Funktion angewiesen werden, den kleinstmöglichen Diff zu berechnen, was bei sehr großen Dateien aber mehr Rechenzeit benötigen kann.

Für den Fall, dass die Dateien nicht auf dem Dateisystem vorliegen, sondern als PHP-Strings im Speicher, steht xdiff_string_diff() zur Verfügung.

Parameter

Name Typ Default Beschreibung
$old_file Pflicht string Pfad zur ursprünglichen (alten) Datei.
$new_file Pflicht string Pfad zur neuen (geänderten) Datei, die mit old_file verglichen wird.
$dest Pflicht string Pfad der Ausgabedatei, in die der erzeugte Unified Diff geschrieben wird.
$context int 3 Anzahl der Kontext-Zeilen (unveränderte Zeilen) die vor und nach jeder Änderung im Diff erscheinen.
$minimal bool false Wenn true, wird der kleinstmögliche Diff berechnet. Kann bei großen Dateien langsamer sein.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Diff erfolgreich erzeugt und in dest geschrieben wurde, andernfalls false (z. B. wenn eine der Quelldateien nicht lesbar ist oder die Zieldatei nicht geschrieben werden kann).

Beispiele

Einfacher Dateivergleich und Diff-Erzeugung

<?php
// Zwei Textdateien anlegen
file_put_contents('/tmp/old.txt', "Zeile 1\nZeile 2\nZeile 3\n");
file_put_contents('/tmp/new.txt', "Zeile 1\nZeile 2 geändert\nZeile 3\nZeile 4 neu\n");

// Unified Diff erzeugen
$result = xdiff_file_diff('/tmp/old.txt', '/tmp/new.txt', '/tmp/output.patch');

if ($result) {
    echo "Diff erfolgreich erzeugt:\n";
    echo file_get_contents('/tmp/output.patch');
} else {
    echo "Fehler beim Erzeugen des Diffs.";
}
Diff erfolgreich erzeugt: --- /tmp/old.txt +++ /tmp/new.txt @@ -1,3 +1,4 @@ Zeile 1 -Zeile 2 +Zeile 2 geändert Zeile 3 +Zeile 4 neu

Diff mit erweitertem Kontext und minimalem Modus

<?php
// Quelldateien
file_put_contents('/tmp/config_old.php', "<?php\n\$debug = false;\n\$version = '1.0';\n\$timeout = 30;\n");
file_put_contents('/tmp/config_new.php', "<?php\n\$debug = true;\n\$version = '1.1';\n\$timeout = 30;\n");

// Diff mit 5 Kontext-Zeilen und minimalem Algorithmus
$ok = xdiff_file_diff(
    '/tmp/config_old.php',
    '/tmp/config_new.php',
    '/tmp/config.patch',
    5,
    true
);

if ($ok) {
    echo "Patch gespeichert.\n";
    echo file_get_contents('/tmp/config.patch');
}
Patch gespeichert. --- /tmp/config_old.php +++ /tmp/config_new.php @@ -1,4 +1,4 @@ <?php -$debug = false; -$version = '1.0'; +$debug = true; +$version = '1.1'; $timeout = 30;

// Wichtig · Fallstricke

Voraussetzung: Die xdiff-Erweiterung ist kein Bestandteil von PHP-Core und muss über PECL installiert werden (pecl install xdiff). Außerdem muss die C-Bibliothek libxdiff auf dem System vorhanden sein.

Nur Textdateien: xdiff_file_diff() ist ausschließlich für Textdateien geeignet. Für binäre Dateien steht xdiff_file_bdiff() zur Verfügung.

Dateiberechtigungen: Stellen Sie sicher, dass der PHP-Prozess Lesezugriff auf old_file und new_file sowie Schreibzugriff auf dest besitzt, um unerwartete Fehlschläge zu vermeiden.