Start · Sprachen · PHP · Referenz · xdiff_file_bdiff

xdiff_file_bdiff

Funktion

Erstellt einen binären Diff zwischen zwei Dateien und speichert das Ergebnis in einer Zieldatei.

seit PHP 1.5.0 Kategorie: misc

Signatur

xdiff_file_bdiff(string $old_file, string $new_file, string $dest): bool

Beschreibung

xdiff_file_bdiff() vergleicht zwei Binärdateien ($old_file und $new_file) auf Byte-Ebene und erzeugt eine kompakte Patch-Datei im xdiff-BDIFF-Format, die in $dest gespeichert wird. Diese Patch-Datei enthält nur die Unterschiede zwischen den beiden Dateien und kann genutzt werden, um die alte Datei mit xdiff_file_bpatch() in die neue Datei umzuwandeln.

Im Gegensatz zu xdiff_file_diff(), das für Textdateien ausgelegt ist, arbeitet BDIFF auf Binärebene und eignet sich daher besonders für kompilierte Programme, Archivdateien, Bilder oder andere binäre Formate, bei denen ein zeilenbasierter Diff keinen Sinn ergibt. Das erzeugte Patch-Format ist nicht dasselbe wie das Unified-Diff-Format und kann nicht mit herkömmlichen Patch-Werkzeugen angewendet werden.

Typische Einsatzgebiete sind Software-Update-Mechanismen, bei denen nur Deltas zwischen Versionen übertragen werden sollen, um Bandbreite zu sparen, oder Versionierungssysteme für binäre Assets.

Parameter

Name Typ Default Beschreibung
$old_file Pflicht string Pfad zur alten (ursprünglichen) Datei, die als Basis für den Diff dient.
$new_file Pflicht string Pfad zur neuen (geänderten) Datei, mit der die alte Datei verglichen wird.
$dest Pflicht string Pfad zur Zieldatei, in der der erzeugte binäre Patch gespeichert wird. Die Datei wird erstellt oder überschrieben.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Diff erfolgreich erstellt und in $dest gespeichert wurde. Bei einem Fehler (z. B. wenn eine der Quelldateien nicht lesbar ist oder $dest nicht geschrieben werden kann) wird false zurückgegeben.

Beispiele

Binären Diff zwischen zwei Versionen einer Datei erstellen

<?php
// Binär-Diff zwischen alter und neuer Programmdatei erzeugen
$old = '/var/releases/app_v1.0.bin';
$new = '/var/releases/app_v1.1.bin';
$patch = '/var/patches/app_v1.0_to_v1.1.bdiff';

if (xdiff_file_bdiff($old, $new, $patch)) {
    echo 'Patch-Datei erfolgreich erstellt: ' . $patch . PHP_EOL;
    echo 'Patch-Größe: ' . filesize($patch) . ' Bytes' . PHP_EOL;
} else {
    echo 'Fehler beim Erstellen des Binär-Diffs.' . PHP_EOL;
}
Patch-Datei erfolgreich erstellt: /var/patches/app_v1.0_to_v1.1.bdiff Patch-Größe: 4096 Bytes

Diff erstellen und anschließend mit bpatch anwenden

<?php
// Schritt 1: Binär-Diff erzeugen
$oldFile  = '/tmp/image_v1.png';
$newFile  = '/tmp/image_v2.png';
$patchFile = '/tmp/image.bdiff';
$restored = '/tmp/image_v2_restored.png';

if (!xdiff_file_bdiff($oldFile, $newFile, $patchFile)) {
    die('Diff konnte nicht erstellt werden.');
}
echo 'Diff erstellt.' . PHP_EOL;

// Schritt 2: Patch auf die alte Datei anwenden, um die neue zu rekonstruieren
if (xdiff_file_bpatch($oldFile, $patchFile, $restored)) {
    echo 'Patch erfolgreich angewendet.' . PHP_EOL;
    echo 'Dateien identisch: ' . (md5_file($newFile) === md5_file($restored) ? 'Ja' : 'Nein') . PHP_EOL;
} else {
    echo 'Fehler beim Anwenden des Patches.' . PHP_EOL;
}
Diff erstellt. Patch erfolgreich angewendet. Dateien identisch: Ja

// Wichtig · Fallstricke

PECL-Erweiterung: xdiff_file_bdiff() ist Teil der PECL-Erweiterung xdiff, die nicht standardmäßig in PHP enthalten ist und separat installiert werden muss (pecl install xdiff).

Dateizugriff: Stellen Sie sicher, dass der PHP-Prozess Lesezugriff auf $old_file und $new_file sowie Schreibzugriff auf das Verzeichnis von $dest hat. Andernfalls schlägt die Funktion stillschweigend fehl und gibt false zurück.

Format-Kompatibilität: Das erzeugte BDIFF-Format ist proprietär und kann nur mit xdiff_file_bpatch() bzw. xdiff_string_bpatch() angewendet werden. Es ist nicht kompatibel mit dem Unix-Werkzeug patch.

Große Dateien: Bei sehr großen Dateien kann der Speicher- und Zeitbedarf erheblich sein. Für derartige Anwendungsfälle empfiehlt sich eine Erhöhung der PHP-Limits memory_limit und max_execution_time.