Start · Sprachen · PHP · Referenz · stream_socket_shutdown

stream_socket_shutdown

Funktion

Beendet eine Vollduplex-Verbindung eines Stream-Sockets in eine oder beide Richtungen (Lesen, Schreiben oder beides).

seit PHP 5.2.1 Kategorie: io

Signatur

stream_socket_shutdown(resource $stream, int $mode): bool

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 deaktivieren
  • STREAM_SHUT_WR (1) — Schreiben deaktivieren
  • STREAM_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

Typ
bool
Beschreibung
Gibt 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);
Shutdown erfolgreich.

// 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.