Signatur
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
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 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');
}
// 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.