Start · Sprachen · PHP · Referenz · xdiff_string_bpatch

xdiff_string_bpatch

Funktion

Wendet einen binären Diff-Patch auf einen String an und gibt den gepatchten String zurück.

seit PHP 1.5.0 Kategorie: misc

Signatur

xdiff_string_bpatch(string $str, string $patch): string|false

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

Typ
string|false
Beschreibung
Gibt den gepatchten String zurück, wenn der Patch erfolgreich angewendet wurde. Bei einem Fehler (z. B. ungültiger Patch oder inkompatible Basisversion) wird 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.";
}
Hello World! This is version 2, updated.

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";
Diff-Größe: ... Bytes Vollständige Revision-2-Größe: ... Bytes Rekonstruiert korrekt: Ja

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