Start · Sprachen · PHP · Referenz · socket_set_blocking

socket_set_blocking

Funktion

Alias von <code>stream_set_blocking()</code> – setzt den Blockierungsmodus eines Stream-Ressourcen-Handles.

seit PHP 4.0.0 Kategorie: http

Signatur

socket_set_blocking(resource $stream, bool $enable): bool

Beschreibung

socket_set_blocking() ist ein Alias der Funktion stream_set_blocking() und ermöglicht es, einen Stream entweder in den blockierenden oder nicht-blockierenden Modus zu versetzen. Im blockierenden Modus wartet ein Lese- oder Schreibaufruf so lange, bis Daten verfügbar sind oder der Vorgang abgeschlossen ist. Im nicht-blockierenden Modus kehren solche Aufrufe sofort zurück, auch wenn noch keine Daten vorliegen.

Der nicht-blockierende Modus ist besonders nützlich bei der Implementierung von asynchronen oder multiplexten Netzwerkverbindungen, bei denen mehrere Streams gleichzeitig überwacht werden sollen (z. B. in Kombination mit stream_select()). So kann ein PHP-Script mehrere Verbindungen verwalten, ohne bei einer einzelnen Verbindung hängen zu bleiben.

Da es sich um einen direkten Alias handelt, ist die Verwendung von stream_set_blocking() vorzuziehen, da dieser Name die eigentliche Funktion klarer beschreibt und der kanonische Name in der PHP-Dokumentation ist.

Die Funktion funktioniert mit allen Stream-Ressourcen, die fopen(), fsockopen(), stream_socket_client() oder ähnliche Funktionen zurückgeben.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Die Stream-Ressource, deren Blockierungsmodus geändert werden soll. Typischerweise ein Datei- oder Netzwerk-Stream-Handle.
$enable Pflicht bool Wenn true, wird der blockierende Modus aktiviert; wenn false, wird der nicht-blockierende Modus aktiviert.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die übergebene Ressource kein gültiger Stream ist).

Beispiele

Nicht-blockierende HTTP-Verbindung mit fsockopen

<?php
// Verbindung zu einem Webserver herstellen
$stream = fsockopen('www.example.com', 80, $errno, $errstr, 5);

if (!$stream) {
    echo "Verbindungsfehler: $errstr ($errno)\n";
    exit;
}

// Auf nicht-blockierenden Modus umschalten
socket_set_blocking($stream, false);

// HTTP-Anfrage senden
fwrite($stream, "GET / HTTP/1.0\r\nHost: www.example.com\r\nConnection: close\r\n\r\n");

// Daten lesen, ohne zu blockieren
$response = '';
while (!feof($stream)) {
    $chunk = fread($stream, 1024);
    if ($chunk === false || $chunk === '') {
        // Keine Daten verfügbar – in echtem Code hier ggf. warten oder andere Tasks ausführen
        break;
    }
    $response .= $chunk;
}

fclose($stream);
echo "Antwortlänge: " . strlen($response) . " Bytes\n";
Antwortlänge: 1234 Bytes

Mehrere Streams mit stream_select() multiplexen

<?php
// Zwei Verbindungen gleichzeitig verwalten
$hosts = ['www.example.com', 'www.php.net'];
$streams = [];

foreach ($hosts as $host) {
    $s = fsockopen($host, 80, $errno, $errstr, 5);
    if ($s) {
        // Nicht-blockierend schalten (Alias für stream_set_blocking)
        socket_set_blocking($s, false);
        fwrite($s, "GET / HTTP/1.0\r\nHost: $host\r\nConnection: close\r\n\r\n");
        $streams[$host] = $s;
    }
}

// Auf lesbare Streams warten (max. 3 Sekunden)
$read = array_values($streams);
$write = null;
$except = null;
$ready = stream_select($read, $write, $except, 3);

if ($ready > 0) {
    foreach ($read as $s) {
        $data = fread($s, 512);
        echo "Empfangen: " . strlen($data) . " Bytes\n";
    }
}

foreach ($streams as $s) {
    fclose($s);
}
Empfangen: 512 Bytes Empfangen: 512 Bytes

// Wichtig · Fallstricke

Deprecation-Hinweis: socket_set_blocking() ist ein veralteter Alias. Es wird empfohlen, stattdessen direkt stream_set_blocking() zu verwenden, da der Alias in zukünftigen PHP-Versionen möglicherweise entfernt werden könnte.

Verwechslungsgefahr: Der Name klingt nach der socket_*-Erweiterung (ext/sockets), gehört aber zur Stream-Erweiterung und funktioniert nicht mit Socket-Ressourcen, die via socket_create() erzeugt wurden. Für solche Sockets muss socket_set_nonblock() bzw. socket_set_block() verwendet werden.

Timeout-Verhalten: Im nicht-blockierenden Modus sollte stream_select() genutzt werden, um effizient auf Ereignisse zu warten, anstatt busy-waiting in einer Schleife zu betreiben.