Start · Sprachen · PHP · Referenz · xdiff_file_merge3

xdiff_file_merge3

Funktion

Führt drei Dateien (eine Basisdatei und zwei geänderte Versionen) zu einer einzigen Ausgabedatei zusammen (3-Wege-Merge).

seit PHP 0.2.0 Kategorie: misc

Signatur

xdiff_file_merge3(string $old_file, string $new_file1, string $new_file2, string $dest): mixed

Beschreibung

xdiff_file_merge3 führt einen sogenannten 3-Wege-Merge durch: Es nimmt eine gemeinsame Basisdatei (old_file) sowie zwei davon abgeleitete, unabhängig veränderte Versionen (new_file1, new_file2) und versucht, alle Änderungen beider neuen Versionen in die Zieldatei (dest) zu schreiben.

Diese Funktion ist besonders nützlich in Versionskontroll- und Kollaborationsszenarien, bei denen zwei Personen gleichzeitig dieselbe Ausgangsdatei bearbeitet haben und die Ergebnisse zusammengeführt werden müssen – ähnlich wie git merge oder das klassische Unix-Tool merge.

Treten Konflikte auf (d. h. beide neue Versionen haben dieselbe Stelle unterschiedlich verändert), werden diese im Merge-Ergebnis als Konfliktmarker eingebettet. Die Funktion gibt in diesem Fall true zurück und schreibt trotzdem eine Ausgabedatei, wobei die Konfliktstellen zur manuellen Auflösung markiert sind.

Die Funktion ist Teil der xdiff-Erweiterung, die auf der libxdiff-Bibliothek basiert. Für das Arbeiten mit Strings statt Dateipfaden steht xdiff_string_merge3 zur Verfügung.

Parameter

Name Typ Default Beschreibung
$old_file Pflicht string Pfad zur gemeinsamen Basisdatei (der ursprüngliche, unveränderte Stand), von der beide neuen Dateien abgeleitet wurden.
$new_file1 Pflicht string Pfad zur ersten geänderten Version der Basisdatei (z. B. Änderungen von Person A).
$new_file2 Pflicht string Pfad zur zweiten geänderten Version der Basisdatei (z. B. Änderungen von Person B).
$dest Pflicht string Pfad zur Zieldatei, in die das Merge-Ergebnis geschrieben wird. Existiert die Datei bereits, wird sie überschrieben.

Rückgabewert

Typ
mixed
Beschreibung

Gibt true zurück, wenn der Merge erfolgreich war (auch dann, wenn Konflikte aufgetreten sind – diese werden als Konfliktmarker in dest eingebettet). Gibt false zurück, wenn ein Fehler aufgetreten ist, z. B. wenn eine der Eingabedateien nicht geöffnet werden konnte oder die Zieldatei nicht beschreibbar ist. Im Konfliktfall enthält die Ausgabedatei Markierungen wie <<<<<<< und >>>>>>>.

Beispiele

Einfacher 3-Wege-Merge zweier Textdateien

<?php
// Basisdatei (ursprünglicher Stand)
file_put_contents('/tmp/base.txt', "Zeile 1\nZeile 2\nZeile 3\n");

// Änderung von Person A: Zeile 2 geändert
file_put_contents('/tmp/version_a.txt', "Zeile 1\nZeile 2 - Änderung A\nZeile 3\n");

// Änderung von Person B: Zeile 3 geändert
file_put_contents('/tmp/version_b.txt', "Zeile 1\nZeile 2\nZeile 3 - Änderung B\n");

$result = xdiff_file_merge3(
    '/tmp/base.txt',
    '/tmp/version_a.txt',
    '/tmp/version_b.txt',
    '/tmp/merged.txt'
);

if ($result === true) {
    echo "Merge erfolgreich (möglicherweise mit Konflikten).\n";
    echo file_get_contents('/tmp/merged.txt');
} else {
    echo "Merge fehlgeschlagen.\n";
}
Merge erfolgreich (möglicherweise mit Konflikten). Zeile 1 Zeile 2 - Änderung A Zeile 3 - Änderung B

Konflikt-Erkennung beim Merge

<?php
// Basisdatei
file_put_contents('/tmp/base.txt', "Zeile 1\nZeile 2\nZeile 3\n");

// Beide Versionen ändern dieselbe Zeile unterschiedlich → Konflikt
file_put_contents('/tmp/version_a.txt', "Zeile 1\nZeile 2 - Änderung A\nZeile 3\n");
file_put_contents('/tmp/version_b.txt', "Zeile 1\nZeile 2 - Änderung B\nZeile 3\n");

$result = xdiff_file_merge3(
    '/tmp/base.txt',
    '/tmp/version_a.txt',
    '/tmp/version_b.txt',
    '/tmp/merged_conflict.txt'
);

$content = file_get_contents('/tmp/merged_conflict.txt');

// Prüfen ob Konfliktmarker vorhanden
if (strpos($content, '<<<<<<<') !== false) {
    echo "Achtung: Merge-Konflikte gefunden – manuelle Auflösung erforderlich!\n";
} else {
    echo "Kein Konflikt – Merge vollständig automatisch.\n";
}

echo $content;
Achtung: Merge-Konflikte gefunden – manuelle Auflösung erforderlich!

// Wichtig · Fallstricke

Voraussetzung: Die xdiff-Erweiterung muss installiert und aktiviert sein (pecl install xdiff). Sie ist nicht Teil der PHP-Standarddistribution.

Konfliktmarker: Wenn beide neuen Dateien dieselbe Stelle der Basisdatei unterschiedlich verändern, werden Konflikte mit Markierungen wie <<<<<<<, ======= und >>>>>>> in die Ausgabedatei geschrieben – ähnlich wie bei git merge. Die Funktion gibt trotzdem true zurück, sodass Konflikte explizit geprüft werden müssen (z. B. per strpos auf die Marker).

Dateizugriff: Alle übergebenen Pfade müssen vom aktuellen PHP-Prozess lesbar (Eingabedateien) bzw. schreibbar (Zieldatei) sein. Fehlerhafte Pfade führen zu einem Rückgabewert von false.

Für In-Memory-Operationen ohne Dateizugriff kann alternativ xdiff_string_merge3 verwendet werden.