Start · Sprachen · PHP · Referenz · socket_set_block

socket_set_block

Funktion

Setzt einen Socket in den blockierenden Modus, sodass Lese- und Schreiboperationen warten, bis Daten verfügbar oder gesendet sind.

seit PHP 4.2.0 Kategorie: http

Signatur

socket_set_block(Socket $socket): bool

Beschreibung

socket_set_block() versetzt einen zuvor erstellten Socket in den blockierenden Modus. In diesem Modus wartet eine I/O-Operation wie socket_read() oder socket_recv() so lange, bis tatsächlich Daten empfangen wurden oder ein Fehler aufgetreten ist. Das Programm wird also an dieser Stelle blockiert, bis die Operation abgeschlossen ist.

Standardmäßig werden neue Sockets bereits im blockierenden Modus erstellt. Diese Funktion ist daher vor allem dann nützlich, wenn ein Socket zuvor mit socket_set_nonblock() in den nicht-blockierenden Modus versetzt wurde und nun wieder auf blockierendes Verhalten zurückgestellt werden soll.

Der blockierende Modus eignet sich für einfache, sequenzielle Kommunikationsszenarien, bei denen das Programm ohnehin auf den Abschluss der I/O-Operation warten muss. Für Server-Anwendungen mit vielen gleichzeitigen Verbindungen ist hingegen der nicht-blockierende Modus in Kombination mit socket_select() vorzuziehen.

Parameter

Name Typ Default Beschreibung
$socket Pflicht Socket Eine gültige Socket-Instanz, die zuvor mit socket_create() oder socket_accept() erzeugt wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück. Im Fehlerfall wird false zurückgegeben und ein Fehlercode kann mit socket_last_error() abgefragt werden.

Beispiele

Socket nach nicht-blockierendem Betrieb wieder auf blockierend setzen

<?php
// Socket erstellen
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

// Socket in nicht-blockierenden Modus versetzen
socket_set_nonblock($socket);
echo "Socket ist jetzt nicht-blockierend." . PHP_EOL;

// Einige nicht-blockierende Operationen ...

// Socket wieder auf blockierenden Modus zurücksetzen
if (socket_set_block($socket)) {
    echo "Socket ist jetzt wieder blockierend." . PHP_EOL;
} else {
    echo "Fehler: " . socket_strerror(socket_last_error($socket)) . PHP_EOL;
}

socket_close($socket);
Socket ist jetzt nicht-blockierend. Socket ist jetzt wieder blockierend.

Einfacher TCP-Client mit blockierendem Socket

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die('Fehler beim Erstellen des Sockets: ' . socket_strerror(socket_last_error()));
}

// Sicherstellen, dass der Socket blockierend ist
socket_set_block($socket);

$result = socket_connect($socket, '127.0.0.1', 8080);
if ($result === false) {
    die('Verbindung fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}

// Nachricht senden (blockiert, bis vollständig gesendet)
socket_write($socket, "Hallo Server!\n");

// Antwort lesen (blockiert, bis Daten verfügbar sind)
$antwort = socket_read($socket, 1024);
echo "Antwort vom Server: " . $antwort . PHP_EOL;

socket_close($socket);

// Wichtig · Fallstricke

Hinweis zur Verwendung: Im blockierenden Modus kann ein PHP-Skript unbegrenzt lange an einem I/O-Aufruf hängen, wenn der Gegensteller keine Daten sendet oder die Verbindung unterbrochen ist. Es empfiehlt sich, in solchen Szenarien socket_select() mit einem Timeout zu verwenden, um Deadlocks zu vermeiden.

Seit PHP 8.0 wird anstelle des früheren Ressourcen-Typs eine Socket-Objekt-Instanz verwendet. Code, der für PHP 7.x geschrieben wurde, muss ggf. angepasst werden.