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