Signatur
Beschreibung
xdiff_string_bpatch gehört zur PECL-Erweiterung xdiff und wendet einen zuvor mit xdiff_string_bdiff oder xdiff_file_bdiff erzeugten binären Patch auf einen im Speicher vorliegenden String an. Das Ergebnis ist der gepatchte String, also die neue Version des Inhalts.
Im Gegensatz zum textbasierten Patch (xdiff_string_patch) arbeitet diese Funktion byte-genau auf beliebigen Binärdaten. Das macht sie besonders nützlich für komprimierte Daten, Binärdateien oder beliebige Byte-Sequenzen, die nicht als Text interpretiert werden sollen.
Ein typischer Anwendungsfall ist die Delta-Komprimierung: Statt komplette Dateien oder Datenbankeinträge zu speichern, werden nur die Unterschiede (Diffs) gespeichert, mit denen jederzeit aus einer Basisversion eine neuere Version rekonstruiert werden kann.
Die Funktion erwartet, dass $patch im binären xdiff-Format vorliegt, das von xdiff_string_bdiff erzeugt wurde. Ungültige Patch-Daten führen zu einem Rückgabewert false.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $str Pflicht | string | Der Original-String (Basisversion), auf den der Patch angewendet werden soll. | |
| $patch Pflicht | string | Der binäre Diff-Patch im xdiff-Format, wie er von xdiff_string_bdiff erzeugt wurde. |
Rückgabewert
false zurückgegeben.Beispiele
Binären Diff erzeugen und anwenden
<?php
// Basisversion und neue Version
$original = "Hello World! This is version 1.";
$new = "Hello World! This is version 2, updated.";
// Binären Diff zwischen Original und neuer Version erzeugen
$patch = xdiff_string_bdiff($original, $new);
// Patch auf das Original anwenden
$result = xdiff_string_bpatch($original, $patch);
if ($result !== false) {
echo $result;
} else {
echo "Fehler beim Anwenden des Patches.";
}
Delta-Komprimierung für Datenbank-Revisionen
<?php
// Simulierte Revisionen eines Datenbankeintrags
$revision1 = serialize(['title' => 'Artikel', 'body' => 'Erster Inhalt.']);
$revision2 = serialize(['title' => 'Artikel', 'body' => 'Zweiter, überarbeiteter Inhalt.']);
// Nur den Diff speichern statt der ganzen Revision
$diff = xdiff_string_bdiff($revision1, $revision2);
echo "Diff-Größe: " . strlen($diff) . " Bytes\n";
echo "Vollständige Revision-2-Größe: " . strlen($revision2) . " Bytes\n";
// Revision 2 aus Revision 1 + Diff rekonstruieren
$rekonstruiert = xdiff_string_bpatch($revision1, $diff);
echo "Rekonstruiert korrekt: " . ($rekonstruiert === $revision2 ? 'Ja' : 'Nein') . "\n";
// Wichtig · Fallstricke
PECL-Erweiterung: xdiff_string_bpatch ist Teil der PECL-xdiff-Erweiterung und steht nicht standardmäßig zur Verfügung. Die Erweiterung muss separat installiert werden (pecl install xdiff).
Kompatibilität des Patches: Der Patch muss exakt zur übergebenen Basisversion passen. Wird ein Patch auf eine falsche Basisversion angewendet, liefert die Funktion entweder false oder ein korrumpiertes Ergebnis. Das Ergebnis sollte daher stets geprüft werden.
Speicherverbrauch: Da sowohl Original- als auch Ergebnis-String vollständig im Arbeitsspeicher gehalten werden, ist diese Funktion für sehr große Binärdaten (mehrere Hundert MB) weniger geeignet. In solchen Fällen sollten die dateibasierten Varianten xdiff_file_bdiff und xdiff_file_bpatch bevorzugt werden.