Start · Sprachen · PHP · Referenz · bzwrite

bzwrite

Funktion

Schreibt binäre Daten in eine geöffnete bzip2-komprimierte Datei und gibt die Anzahl der geschriebenen Bytes zurück.

seit PHP 4.0.4 Kategorie: io

Signatur

bzwrite(resource $bz, string $data, int $length = 0): int|false

Beschreibung

bzwrite() schreibt den Inhalt des Parameters data in die mit bzopen() geöffnete bzip2-Datei. Die Funktion ist binär-sicher, das heißt, sie kann beliebige Binärdaten (auch solche mit Nullbytes) korrekt verarbeiten und in das bzip2-Format komprimieren.

Der optionale Parameter length begrenzt die Anzahl der zu schreibenden Bytes. Wird er weggelassen oder auf 0 gesetzt, wird der vollständige Inhalt von data geschrieben. Dies entspricht dem Verhalten von fwrite() für normale Dateien, nur dass die Ausgabe automatisch bzip2-komprimiert wird.

bzwrite() ist besonders nützlich, wenn große Datenmengen oder binäre Inhalte (z. B. Datenbankdumps, Logdateien oder Binärdateien) platzsparend auf dem Dateisystem gespeichert werden sollen. Die bzip2-Kompression erzielt in der Regel eine bessere Kompressionsrate als gzip.

Die zugehörige Datei muss zuvor mit bzopen() im Schreibmodus ('w') geöffnet worden sein. Nach dem Schreiben sollte die Datei mit bzclose() geschlossen werden, um sicherzustellen, dass alle internen bzip2-Puffer korrekt geleert und der Datei-Abschlussmarker geschrieben werden.

Parameter

Name Typ Default Beschreibung
$bz Pflicht resource Ein gültiges bzip2-Datei-Handle, das zuvor mit bzopen() im Schreibmodus ('w') geöffnet wurde.
$data Pflicht string Die zu schreibenden Daten als Zeichenkette. Darf beliebige Binärdaten einschließlich Nullbytes enthalten.
$length int 0 Optionale Anzahl der zu schreibenden Bytes aus data. Bei 0 (Standardwert) wird der gesamte Inhalt von data geschrieben.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der tatsächlich geschriebenen (unkomprimierten) Bytes zurück. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einfaches Schreiben eines Textes in eine bzip2-Datei

<?php
$bz = bzopen('/tmp/beispiel.bz2', 'w');
if ($bz === false) {
    die('Datei konnte nicht geöffnet werden.');
}

$text = "Hallo, das ist ein komprimierter Text!\n";
$geschrieben = bzwrite($bz, $text);

echo "Bytes geschrieben: " . $geschrieben . "\n";

bzclose($bz);
Bytes geschrieben: 39

Zeilenweises Schreiben einer Logdatei im bzip2-Format

<?php
$logeintraege = [
    "2024-01-01 10:00:00 - Benutzer angemeldet\n",
    "2024-01-01 10:05:00 - Datei hochgeladen\n",
    "2024-01-01 10:10:00 - Benutzer abgemeldet\n",
];

$bz = bzopen('/tmp/anwendung.log.bz2', 'w');
if ($bz === false) {
    die('Logdatei konnte nicht geöffnet werden.');
}

$gesamtBytes = 0;
foreach ($logeintraege as $zeile) {
    $result = bzwrite($bz, $zeile);
    if ($result === false) {
        echo "Fehler beim Schreiben einer Zeile!\n";
    } else {
        $gesamtBytes += $result;
    }
}

bzclose($bz);
echo "Insgesamt $gesamtBytes Bytes (unkomprimiert) in die bzip2-Datei geschrieben.\n";
Insgesamt 99 Bytes (unkomprimiert) in die bzip2-Datei geschrieben.

Begrenztes Schreiben mit dem length-Parameter

<?php
$bz = bzopen('/tmp/begrenzt.bz2', 'w');
if ($bz === false) {
    die('Datei konnte nicht geöffnet werden.');
}

$daten = "ABCDEFGHIJ";
// Nur die ersten 5 Bytes schreiben
$geschrieben = bzwrite($bz, $daten, 5);

echo "Bytes geschrieben: " . $geschrieben . "\n"; // Gibt 5 aus

bzclose($bz);
Bytes geschrieben: 5

// Wichtig · Fallstricke

Wichtig: bzwrite() gibt die Anzahl der unkomprimierten Bytes zurück, nicht die tatsächliche Größe der auf dem Dateisystem gespeicherten Daten. Die tatsächliche Dateigröße ist je nach Kompressionsrate deutlich kleiner.

Die bzip2-Erweiterung ist nicht standardmäßig in allen PHP-Builds aktiviert. Sie muss beim Kompilieren mit --with-bz2 aktiviert werden oder über eine Paketverwaltung installiert werden. Prüfen Sie mit function_exists('bzwrite'), ob die Funktion verfügbar ist.

Wird bzclose() nach dem Schreiben nicht aufgerufen, kann die bzip2-Datei beschädigt oder unlesbar sein, da der abschließende Kompressionsblock nicht in die Datei geschrieben wird. Verwenden Sie daher stets bzclose() oder setzen Sie das Handle in einem try/finally-Block.