Start · Sprachen · PHP · Referenz · xdiff_file_rabdiff

xdiff_file_rabdiff

Funktion

Erstellt einen binären Diff zweier Dateien mithilfe des Rabin-Fingerprinting-Algorithmus und speichert das Ergebnis in einer Ausgabedatei.

seit PHP 1.5.0 Kategorie: misc

Signatur

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

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

Typ
bool
Beschreibung
Gibt 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 erfolgreich erstellt: /var/app/patches/v1.0_to_v1.1.rabdiff

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;
}
Diff erstellt. Patch erfolgreich angewendet. Datei: firmware_v2_restored.bin Wiederhergestellte Datei ist identisch mit der Zieldatei.

// 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.