Start · Sprachen · PHP · Referenz · xdiff_file_bpatch

xdiff_file_bpatch

Funktion

Wendet einen binären Patch (erzeugt mit <code>xdiff_file_bdiff</code>) auf eine Datei an und schreibt das Ergebnis in eine Zieldatei.

seit PHP 1.5.0 Kategorie: misc

Signatur

xdiff_file_bpatch(string $file, string $patch, string $dest): bool

Beschreibung

xdiff_file_bpatch() liest eine Originaldatei sowie einen binären Diff-Patch (im xdiff-Binärformat) und erzeugt eine neue, gepatchte Ausgabedatei. Sie ist das Gegenstück zu xdiff_file_bdiff(), die den Patch erstellt.

Diese Funktion eignet sich besonders für den effizienten Einsatz bei größeren Binärdateien (z. B. Bilder, Archive, ausführbare Dateien), da das binäre Diff-Format kompakter und schneller verarbeitbar ist als das zeilenbasierte Text-Diff-Format. Typische Anwendungsfälle sind automatische Software-Updates oder Versionsverwaltung von Binärressourcen.

Die Funktion benötigt die PECL-Erweiterung xdiff. Sie arbeitet rein dateibasiert; für speicherbasierte Operationen steht xdiff_string_bpatch() zur Verfügung.

Wichtig: Der Patch muss mit xdiff_file_bdiff() oder xdiff_string_bdiff() erzeugt worden sein. Patches im Text-Diff-Format sind hier nicht kompatibel.

Parameter

Name Typ Default Beschreibung
$file Pflicht string Pfad zur Originaldatei, auf die der Patch angewendet werden soll.
$patch Pflicht string Pfad zur Binär-Patch-Datei, die zuvor mit xdiff_file_bdiff() erzeugt wurde.
$dest Pflicht string Pfad zur Zieldatei, in die das gepatchte Ergebnis geschrieben wird. Bereits vorhandene Dateien werden überschrieben.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Patch erfolgreich angewendet und die Zieldatei geschrieben wurde. Bei einem Fehler (z. B. Datei nicht lesbar, ungültiges Patch-Format) wird false zurückgegeben.

Beispiele

Binären Patch erzeugen und anwenden

<?php
// Schritt 1: Binären Diff zwischen alter und neuer Datei erzeugen
$old = 'firmware_v1.bin';
$new = 'firmware_v2.bin';
$patch = 'firmware.bpatch';

if (xdiff_file_bdiff($old, $new, $patch)) {
    echo "Patch erfolgreich erstellt: $patch" . PHP_EOL;
} else {
    echo "Fehler beim Erstellen des Patches." . PHP_EOL;
    exit(1);
}

// Schritt 2: Patch auf die alte Datei anwenden
$dest = 'firmware_patched.bin';

if (xdiff_file_bpatch($old, $patch, $dest)) {
    echo "Patch erfolgreich angewendet. Ergebnis: $dest" . PHP_EOL;
} else {
    echo "Fehler beim Anwenden des Patches." . PHP_EOL;
}
Patch erfolgreich erstellt: firmware.bpatch Patch erfolgreich angewendet. Ergebnis: firmware_patched.bin

Ergebnis mit Originaldatei vergleichen

<?php
$original = 'image_v2.png';
$patched  = 'image_patched.png';
$patch    = 'image.bpatch';

if (xdiff_file_bpatch('image_v1.png', $patch, $patched)) {
    // Prüfen, ob gepatchte Datei mit dem Ziel übereinstimmt
    if (md5_file($original) === md5_file($patched)) {
        echo "Patch korrekt: Dateien sind identisch." . PHP_EOL;
    } else {
        echo "Warnung: Dateien weichen voneinander ab!" . PHP_EOL;
    }
} else {
    echo "Patch konnte nicht angewendet werden." . PHP_EOL;
}
Patch korrekt: Dateien sind identisch.

// Wichtig · Fallstricke

PECL-Erweiterung erforderlich: xdiff_file_bpatch() ist Teil der PECL-Erweiterung xdiff und nicht standardmäßig in PHP enthalten. Sie muss separat installiert werden (pecl install xdiff).

Dateiberechtigungen: Stellen Sie sicher, dass der PHP-Prozess Lesezugriff auf file und patch sowie Schreibzugriff auf das Verzeichnis von dest besitzt. Andernfalls schlägt die Funktion ohne aussagekräftige Fehlermeldung fehl.

Formatkompatibilität: Verwenden Sie ausschließlich Patches, die mit xdiff_file_bdiff() oder xdiff_string_bdiff() erstellt wurden. Text-Diff-Patches (erzeugt mit xdiff_file_diff()) sind nicht kompatibel und führen zu einem Fehler.

Sicherheit: Vertrauen Sie nie ungeprüften Patch-Dateien aus externen Quellen, da fehlerhafte oder manipulierte Patches zu unerwünschten Dateiinhalten führen können. Validieren Sie den Ursprung von Patches und prüfen Sie das Ergebnis z. B. über Checksummen (MD5, SHA-256).