Start · Sprachen · PHP · Referenz · xdiff_string_bdiff

xdiff_string_bdiff

Funktion

Erstellt einen binären Diff zweier Strings und gibt ihn als String zurück.

seit PHP 5.2.0 Kategorie: misc

Signatur

xdiff_string_bdiff(string $old_data, string $new_data): string|false

Beschreibung

xdiff_string_bdiff() berechnet den binären Unterschied (Diff) zwischen zwei Strings $old_data und $new_data und gibt das Ergebnis als Binär-Patch-String zurück. Das Format des erzeugten Patches basiert auf dem VCDIFF-Standard (RFC 3284) und ist für beliebige Binärdaten geeignet – im Gegensatz zu textbasierten Diff-Formaten.

Diese Funktion eignet sich besonders gut für den Einsatz bei binären Dateien wie komprimierte Archive, Bilder oder andere Nicht-Text-Formate, bei denen klassische Text-Diffs (xdiff_string_diff) versagen würden. Der erzeugte Patch kann anschließend mit xdiff_string_bpatch() auf den ursprünglichen String angewendet werden, um den neuen Stand wiederherzustellen.

Die Funktion ist Teil der xdiff-Erweiterung, die separat installiert werden muss (PECL-Paket). Sie kommt häufig in Versionierungssystemen, Dateiübertragungsprotokollen oder Update-Mechanismen zum Einsatz, wo nur die Differenz zwischen zwei Versionen übertragen werden soll, um Bandbreite zu sparen.

Beachte, dass für sehr große Datenmengen die dateibasierte Variante xdiff_file_bdiff() bevorzugt werden sollte, da diese speichereffizienter arbeitet und keine vollständigen Daten im Arbeitsspeicher halten muss.

Parameter

Name Typ Default Beschreibung
$old_data Pflicht string Der ursprüngliche (alte) Datenstring, von dem aus der Diff berechnet wird.
$new_data Pflicht string Der neue (aktualisierte) Datenstring, auf dessen Basis der Patch erstellt wird.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den binären Patch als String zurück, der die Unterschiede zwischen $old_data und $new_data beschreibt. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einfacher Binär-Diff zweier Strings

<?php
$old = "Dies ist die ursprüngliche Version des Textes.";
$new = "Dies ist die neue Version des Textes mit Änderungen.";

$patch = xdiff_string_bdiff($old, $new);

if ($patch !== false) {
    echo "Patch wurde erfolgreich erstellt. Größe: " . strlen($patch) . " Bytes\n";
    
    // Patch anwenden, um den neuen Stand wiederherzustellen
    $restored = xdiff_string_bpatch($old, $patch);
    echo "Wiederhergestellter Text: " . $restored . "\n";
    echo "Identisch mit Original: " . ($restored === $new ? 'Ja' : 'Nein') . "\n";
} else {
    echo "Fehler beim Erstellen des Patches.\n";
}
Patch wurde erfolgreich erstellt. Größe: 63 Bytes Wiederhergestellter Text: Dies ist die neue Version des Textes mit Änderungen. Identisch mit Original: Ja

Binäre Daten als Diff speichern und übertragen

<?php
// Simulierte Binärdaten (z. B. Inhalt komprimierter Dateien)
$old_binary = file_get_contents('version1.bin');
$new_binary = file_get_contents('version2.bin');

$patch = xdiff_string_bdiff($old_binary, $new_binary);

if ($patch !== false) {
    // Patch speichern (deutlich kleiner als die vollständige neue Datei)
    file_put_contents('update.bdiff', $patch);
    
    $original_size = strlen($new_binary);
    $patch_size    = strlen($patch);
    $saving        = round((1 - $patch_size / $original_size) * 100, 1);
    
    echo "Originalgröße: {$original_size} Bytes\n";
    echo "Patchgröße:    {$patch_size} Bytes\n";
    echo "Einsparung:    {$saving}%\n";
} else {
    echo "Fehler beim Erstellen des binären Diffs.\n";
}

// Wichtig · Fallstricke

Abhängigkeit: Die xdiff-Erweiterung ist kein Bestandteil des PHP-Kerns und muss über PECL installiert werden (pecl install xdiff). Prüfe vor dem Einsatz die Verfügbarkeit mit extension_loaded('xdiff').

Speicherverbrauch: Da beide Strings vollständig im Arbeitsspeicher gehalten werden, kann xdiff_string_bdiff() bei sehr großen Daten zu Speicherproblemen führen. Für Dateien ab mehreren Megabyte sollte stattdessen xdiff_file_bdiff() eingesetzt werden.

Kompatibilität: Der erzeugte Binär-Patch ist nicht kompatibel mit text-basierten Patches aus xdiff_string_diff(). Zum Anwenden muss zwingend xdiff_string_bpatch() verwendet werden.