Start · Sprachen · PHP · Referenz · stream_set_chunk_size

stream_set_chunk_size

Funktion

Setzt die Chunk-Größe (Blockgröße) eines Streams und gibt die vorherige Chunk-Größe zurück.

seit PHP 5.4.0 Kategorie: io

Signatur

stream_set_chunk_size(resource $stream, int $size): int

Beschreibung

stream_set_chunk_size legt fest, in wie großen Blöcken (Chunks) Daten von einem Stream gelesen werden. Die Chunk-Größe beeinflusst, wie viele Bytes PHP intern puffert, bevor stream_filter_append-Filter oder ähnliche Mechanismen auf die Daten angewendet werden.

Diese Funktion ist besonders dann nützlich, wenn eigene Stream-Filter implementiert werden (über php_user_filter), da die gewählte Chunk-Größe direkt bestimmt, wie viele Daten auf einmal an die filter()-Methode des Filters übergeben werden. Eine kleinere Chunk-Größe führt zu häufigeren Filter-Aufrufen, eine größere Chunk-Größe reduziert den Overhead, kann aber zu höherem Speicherbedarf führen.

Der Standardwert der Chunk-Größe beträgt in der Regel 8192 Bytes (8 KB). Bei der Verarbeitung großer Dateien oder Netzwerk-Streams kann eine Anpassung der Chunk-Größe die Performance optimieren – etwa wenn bekannt ist, dass Nachrichten oder Datenpakete immer eine bestimmte Größe haben.

Zu beachten ist, dass der tatsächliche Effekt dieser Funktion vom verwendeten Stream-Wrapper abhängt. Bei manchen Wrappern oder wenn kein benutzerdefinierter Filter angehängt ist, zeigt sich möglicherweise kein spürbarer Unterschied im Verhalten.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Die Stream-Ressource, deren Chunk-Größe geändert werden soll. Muss ein gültiger, geöffneter Stream sein (z. B. von fopen() oder fsockopen()).
$size Pflicht int Die neue Chunk-Größe in Bytes. Muss ein positiver Ganzzahlwert sein. Werte kleiner oder gleich 0 führen zu einem Fehler.

Rückgabewert

Typ
int
Beschreibung
Gibt die vorherige Chunk-Größe des Streams in Bytes zurück. Im Fehlerfall (z. B. ungültiger $size-Wert) wird FALSE zurückgegeben.

Beispiele

Chunk-Größe eines Datei-Streams anpassen

<?php
// Datei öffnen
$stream = fopen('beispiel.txt', 'r');

if ($stream === false) {
    die('Datei konnte nicht geöffnet werden.');
}

// Vorherige Chunk-Größe abfragen und neue setzen (4 KB)
$vorherige = stream_set_chunk_size($stream, 4096);
echo "Vorherige Chunk-Größe: {$vorherige} Bytes\n";
echo "Neue Chunk-Größe: 4096 Bytes\n";

fclose($stream);
Vorherige Chunk-Größe: 8192 Bytes Neue Chunk-Größe: 4096 Bytes

Chunk-Größe zusammen mit einem benutzerdefinierten Stream-Filter

<?php
// Eigenen Stream-Filter definieren
class UppercaseFilter extends php_user_filter {
    public function filter($in, $out, &$consumed, $closing): int {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = strtoupper($bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register('uppercase', 'UppercaseFilter');

// Temporären Stream erstellen und Filter anhängen
$stream = fopen('php://memory', 'r+');
fwrite($stream, 'hallo welt, dies ist ein test.');
rewind($stream);

// Chunk-Größe auf 10 Bytes setzen, damit der Filter kleinere Blöcke verarbeitet
$vorherige = stream_set_chunk_size($stream, 10);
echo "Vorherige Chunk-Größe: {$vorherige} Bytes\n";

stream_filter_append($stream, 'uppercase', STREAM_FILTER_READ);

// Stream lesen
echo stream_get_contents($stream) . "\n";

fclose($stream);
Vorherige Chunk-Größe: 8192 Bytes HALLO WELT, DIES IST EIN TEST.

// Wichtig · Fallstricke

Positive Werte erforderlich: Der Parameter $size muss eine positive ganze Zahl sein. Ein Wert von 0 oder negativ führt zu einem E_WARNING und gibt FALSE zurück.

Wirkung abhängig vom Wrapper: Nicht alle Stream-Wrapper reagieren gleich auf eine Änderung der Chunk-Größe. Bei Standard-Dateistreams ohne angehängten Filter ist der Effekt möglicherweise nicht messbar. Der größte Unterschied zeigt sich bei benutzerdefinierten Stream-Filtern (php_user_filter).

Speicher und Performance: Eine sehr kleine Chunk-Größe kann bei großen Datenmengen den Overhead durch häufige Filter-Aufrufe erhöhen. Eine sehr große Chunk-Größe kann temporär viel Speicher belegen. Die Wahl der optimalen Chunk-Größe sollte anwendungsfallbezogen getestet werden.