Signatur
Beschreibung
xdiff_file_rabdiff() vergleicht zwei Binärdateien ($old_file und $new_file) und erzeugt eine kompakte Diff-Datei, die die Unterschiede zwischen beiden beschreibt. Als Algorithmus wird das Rabin-Fingerprinting verwendet, das bei großen Binärdateien effizienter ist als der klassische xdiff_file_bdiff()-Ansatz.
Der erzeugte Diff kann anschließend mit xdiff_file_bpatch() auf die Originaldatei angewendet werden, um die neue Datei wiederherzustellen. Dies ist besonders nützlich für Patch-Systeme, Software-Updates oder Versions-Management, bei denen nur die Unterschiede zwischen Versionen übertragen werden sollen.
Im Vergleich zu xdiff_file_bdiff() erzeugt Rabin-Fingerprinting in der Regel kleinere und effizientere Diffs für binäre Daten, da der Algorithmus inhaltsorientierte Chunk-Grenzen erkennt. Für rein textbasierte Diffs empfiehlt sich hingegen xdiff_file_diff().
Die Funktion gehört zur PECL-Erweiterung xdiff, die separat installiert werden muss und nicht Teil der PHP-Standardinstallation ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $old_file Pflicht | string | Pfad zur älteren (Original-)Datei, die als Basis für den Diff dient. | |
| $new_file Pflicht | string | Pfad zur neueren Datei, deren Unterschiede gegenüber $old_file im Diff festgehalten werden. |
|
| $dest Pflicht | string | Pfad zur Ausgabedatei, in die der erzeugte binäre Diff geschrieben wird. Die Datei wird erstellt oder überschrieben. |
Rückgabewert
true zurück, wenn der Diff erfolgreich erstellt und in $dest gespeichert wurde. Im Fehlerfall (z. B. Datei nicht lesbar, Schreibfehler) wird false zurückgegeben.Beispiele
Einfachen Rabin-Diff zweier Binärdateien erstellen
<?php
$oldFile = '/var/app/releases/v1.0/app.bin';
$newFile = '/var/app/releases/v1.1/app.bin';
$diffFile = '/var/app/patches/v1.0_to_v1.1.rabdiff';
if (xdiff_file_rabdiff($oldFile, $newFile, $diffFile)) {
echo "Diff erfolgreich erstellt: $diffFile" . PHP_EOL;
} else {
echo "Fehler beim Erstellen des Diffs." . PHP_EOL;
}
Diff erstellen und anschließend Patch anwenden
<?php
$oldFile = 'firmware_v1.bin';
$newFile = 'firmware_v2.bin';
$diffFile = 'firmware_v1_to_v2.rabdiff';
$patchedFile = 'firmware_v2_restored.bin';
// Diff erzeugen
if (!xdiff_file_rabdiff($oldFile, $newFile, $diffFile)) {
die('Diff konnte nicht erstellt werden.');
}
echo 'Diff erstellt.' . PHP_EOL;
// Patch auf die alte Datei anwenden, um die neue Datei wiederherzustellen
if (xdiff_file_bpatch($oldFile, $diffFile, $patchedFile)) {
echo 'Patch erfolgreich angewendet. Datei: ' . $patchedFile . PHP_EOL;
// Vergleich: Sind die Dateien identisch?
if (md5_file($newFile) === md5_file($patchedFile)) {
echo 'Wiederhergestellte Datei ist identisch mit der Zieldatei.' . PHP_EOL;
}
} else {
echo 'Fehler beim Anwenden des Patches.' . PHP_EOL;
}
// Wichtig · Fallstricke
PECL-Erweiterung erforderlich: xdiff_file_rabdiff() ist Teil der PECL-Erweiterung xdiff, die nicht standardmäßig in PHP enthalten ist. Sie muss über PECL installiert und in der php.ini aktiviert werden (extension=xdiff).
Kompatibilität: Der mit xdiff_file_rabdiff() erzeugte Diff ist nicht mit dem von xdiff_file_bdiff() erzeugten Format kompatibel. Zum Anwenden des Rabin-Diffs muss stets xdiff_file_bpatch() verwendet werden.
Dateiberechtigungen: Stellen Sie sicher, dass der PHP-Prozess Lesezugriff auf $old_file und $new_file sowie Schreibzugriff auf das Verzeichnis von $dest hat, da die Funktion andernfalls false zurückgibt.