Start · Sprachen · PHP · Referenz · stream_bucket_new

stream_bucket_new

Funktion

Erzeugt ein neues Bucket-Objekt mit dem angegebenen Pufferinhalt für die Verwendung in Stream-Filter.

seit PHP 5.0.0 Kategorie: io

Signatur

stream_bucket_new(resource $stream, string $buffer): object

Beschreibung

stream_bucket_new() erstellt ein neues Bucket-Objekt, das einen Datenpuffer für einen Stream repräsentiert. Buckets werden innerhalb von benutzerdefinierten Stream-Filtern (Klassen, die php_user_filter erweitern) verwendet, um Daten in der Methode filter() zu verarbeiten und weiterzugeben.

Ein Bucket kapselt einen Datenblock ($buffer) zusammen mit einer Längenangabe ($datalen) und einer Referenz auf den zugehörigen Stream. Der erzeugte Bucket kann anschließend mit stream_bucket_append() oder stream_bucket_prepend() in eine Bucket-Brigade eingefügt werden, die dann an den nächsten Filter oder die Anwendung weitergeleitet wird.

Diese Funktion ist besonders nützlich, wenn man in einem Stream-Filter neue oder veränderte Daten produziert, die nicht direkt aus dem eingehenden Bucket-Strom stammen – beispielsweise beim Einfügen von Präfixen, Suffixen oder beim Ersetzen von Inhalten während des Lese- oder Schreibvorgangs.

  • stream_bucket_append(): Hängt einen Bucket ans Ende einer Brigade an.
  • stream_bucket_prepend(): Fügt einen Bucket am Anfang einer Brigade ein.
  • stream_bucket_make_writeable(): Entnimmt den nächsten Bucket aus einer Brigade zur Bearbeitung.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Der Stream, für den das Bucket erzeugt werden soll. Innerhalb von php_user_filter::filter() steht hierfür das Attribut $this->stream zur Verfügung.
$buffer Pflicht string Der Dateninhalt (Puffer), den das neue Bucket enthalten soll. Die Länge wird automatisch ermittelt und im Attribut $bucket->datalen gespeichert.

Rückgabewert

Typ
object
Beschreibung
Gibt ein Bucket-Objekt zurück. Das Objekt besitzt die Eigenschaften data (der Pufferinhalt als String) und datalen (die Länge des Puffers als Integer).

Beispiele

Einfacher Stream-Filter mit stream_bucket_new

<?php
class UpperCaseFilter extends php_user_filter {
    public function filter($in, $out, &$consumed, bool $closing): int {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $consumed += $bucket->datalen;
            // Neues Bucket mit veränderten Daten erzeugen
            $newBucket = stream_bucket_new($this->stream, strtoupper($bucket->data));
            stream_bucket_append($out, $newBucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register('uppercase', 'UpperCaseFilter');

$fp = fopen('php://memory', 'r+');
fwrite($fp, 'Hallo Welt!');
rewind($fp);

stream_filter_append($fp, 'uppercase');
echo stream_get_contents($fp);
// Ausgabe: HALLO WELT!
fclose($fp);
HALLO WELT!

Präfix an jeden Datenblock anhängen

<?php
class PrefixFilter extends php_user_filter {
    public function filter($in, $out, &$consumed, bool $closing): int {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $consumed += $bucket->datalen;
            // Präfix-Bucket voranstellen
            $prefix = stream_bucket_new($this->stream, '[LOG] ');
            stream_bucket_append($out, $prefix);
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register('prefix', 'PrefixFilter');

$fp = fopen('php://memory', 'r+');
fwrite($fp, 'Datenbankfehler aufgetreten.');
rewind($fp);

stream_filter_append($fp, 'prefix');
echo stream_get_contents($fp);
fclose($fp);
[LOG] Datenbankfehler aufgetreten.

// Wichtig · Fallstricke

Verwendungskontext: stream_bucket_new() ist ausschließlich sinnvoll innerhalb der filter()-Methode eines benutzerdefinierten Stream-Filters (Klasse, die php_user_filter erweitert). Außerhalb dieses Kontexts hat die Funktion keinen praktischen Nutzen.

Speicherverwaltung: Die erzeugten Bucket-Objekte werden intern von PHP verwaltet. Es ist nicht notwendig, sie manuell zu zerstören. Allerdings sollte darauf geachtet werden, dass alle erzeugten Buckets entweder in die ausgehende Brigade eingefügt oder verworfen werden, um Speicherlecks zu vermeiden.

PHP-Version: Die genaue interne Implementierung und das Verhalten von Bucket-Objekten können zwischen PHP-Versionen leicht variieren. Die Eigenschaften data und datalen sind jedoch stabil und zuverlässig verfügbar.