Signatur
Beschreibung
stream_socket_shutdown() ermöglicht es, eine bestehende Socket-Verbindung kontrolliert zu beenden, ohne den Stream sofort zu schließen. Im Gegensatz zu fclose() kann damit gezielt nur das Lesen, nur das Schreiben oder beides deaktiviert werden, während die Stream-Ressource technisch noch existiert.
Typischer Anwendungsfall ist das sogenannte Half-Close: Eine Seite signalisiert dem Kommunikationspartner, dass keine weiteren Daten gesendet werden (z. B. durch Abschalten von STREAM_SHUT_WR), wartet aber noch auf ausstehende Antworten. Dies ist ein sauberes Protokollmuster bei TCP-basierten Verbindungen.
Die Funktion ist besonders nützlich in Server-Anwendungen, die auf stream_socket_server() oder stream_socket_client() basieren, wenn ein geordnetes Verbindungsende ohne sofortigen Ressourcenverlust gewünscht wird. Nach dem Shutdown kann der Stream noch mit fclose() vollständig freigegeben werden.
STREAM_SHUT_RD(0) — Lesen deaktivierenSTREAM_SHUT_WR(1) — Schreiben deaktivierenSTREAM_SHUT_RDWR(2) — Lesen und Schreiben deaktivieren
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $stream Pflicht | resource | Eine gültige Stream-Ressource, die über stream_socket_client() oder stream_socket_server() geöffnet wurde. |
|
| $mode Pflicht | int | Eine der Konstanten STREAM_SHUT_RD (0), STREAM_SHUT_WR (1) oder STREAM_SHUT_RDWR (2), die festlegt, welche Richtung(en) der Verbindung beendet werden sollen. |
Rückgabewert
true bei Erfolg zurück, false wenn der Shutdown fehlschlägt, z. B. wenn keine gültige Socket-Ressource übergeben wurde.Beispiele
Schreibkanal nach Senden einer Anfrage schließen (Half-Close)
<?php
// Verbindung zu einem einfachen Echo-Server aufbauen
$client = stream_socket_client('tcp://127.0.0.1:9000', $errno, $errstr, 5);
if (!$client) {
die("Verbindungsfehler: $errstr ($errno)\n");
}
// Nachricht senden
fwrite($client, "Hallo Server!\n");
// Schreibkanal schließen — signalisiert dem Server, dass keine weiteren Daten kommen
stream_socket_shutdown($client, STREAM_SHUT_WR);
// Antwort des Servers noch lesen
while (!feof($client)) {
echo fgets($client);
}
// Stream vollständig freigeben
fclose($client);
Verbindung vollständig per Shutdown beenden
<?php
$socket = stream_socket_client('tcp://example.com:80', $errno, $errstr, 10);
if (!$socket) {
die("Fehler: $errstr ($errno)\n");
}
// HTTP-Anfrage senden
fwrite($socket, "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n");
// Antwort lesen
$response = stream_get_contents($socket);
// Beide Richtungen herunterfahren
$result = stream_socket_shutdown($socket, STREAM_SHUT_RDWR);
echo $result ? "Shutdown erfolgreich." : "Shutdown fehlgeschlagen.";
// Ressource freigeben
fclose($socket);
// Wichtig · Fallstricke
Wichtig: stream_socket_shutdown() schließt die Stream-Ressource nicht. Nach dem Shutdown sollte fclose() aufgerufen werden, um Ressourcen freizugeben.
Nicht alle Stream-Typen unterstützen Shutdown-Operationen. Die Funktion ist primär für TCP-Sockets gedacht. Bei UDP- oder anderen verbindungslosen Protokollen kann das Verhalten undefiniert sein.
Bei STREAM_SHUT_RD können bereits gepufferte Daten möglicherweise noch gelesen werden, je nach Betriebssystem und PHP-Version. Verlasse dich nicht auf konsistentes Verhalten über alle Plattformen hinweg.