Signatur
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
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;
}
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;
}
// 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).