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