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