Start · Sprachen · PHP · Referenz · socket_get_status

socket_get_status

Funktion

Alias von <code>stream_get_meta_data()</code> — gibt Metadaten zu einem offenen Stream zurück.

seit PHP 4.3.0 Kategorie: http

Signatur

socket_get_status(resource $stream): array

Beschreibung

socket_get_status() ist ein direkter Alias der Funktion stream_get_meta_data() und liefert ein assoziatives Array mit Informationen über den übergebenen Stream. Dazu gehören u. a. ob das Ende des Streams erreicht wurde (eof), ob der Stream blockiert ist (blocked), wie lange der Lesevorgang blockiert war (timed_out) sowie Informationen über den verwendeten Stream-Wrapper und -Filter.

Typische Einsatzbereiche sind Netzwerk-Sockets, die mit fsockopen() oder stream_socket_client() geöffnet wurden, sowie Datei-Streams. Mit den zurückgegebenen Metadaten lässt sich z. B. prüfen, ob ein Timeout beim Lesen aufgetreten ist oder ob der Stream noch beschreibbar bzw. lesbar ist.

Da es sich um einen Alias handelt, ist es empfehlenswert, stattdessen direkt stream_get_meta_data() zu verwenden, da Aliase in zukünftigen PHP-Versionen entfernt werden könnten. Die Funktion eignet sich besonders in HTTP-Clients oder beim Arbeiten mit Low-Level-TCP-Verbindungen, um den Zustand der Verbindung zu überwachen.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Ein geöffneter Stream (z. B. von fopen(), fsockopen() oder stream_socket_client()), dessen Metadaten abgefragt werden sollen.

Rückgabewert

Typ
array
Beschreibung

Gibt ein assoziatives Array mit folgenden Schlüsseln zurück:

  • timed_out (bool): true, wenn beim letzten Lesen ein Timeout aufgetreten ist.
  • blocked (bool): true, wenn der Stream im blockierenden I/O-Modus ist.
  • eof (bool): true, wenn das Ende des Streams erreicht wurde.
  • unread_bytes (int): Anzahl der noch nicht gelesenen Bytes im internen Puffer.
  • stream_type (string): Bezeichnung des Stream-Typs (z. B. tcp_socket/ssl).
  • wrapper_type (string): Name des Wrapper-Protokolls (z. B. http oder plainfile).
  • wrapper_data (mixed): Wrapper-spezifische Daten (z. B. HTTP-Antwort-Header als Array).
  • filters (array): Liste der auf den Stream angewendeten Filter.
  • mode (string): Öffnungsmodus des Streams (z. B. r, w).
  • seekable (bool): true, wenn im Stream navigiert werden kann.
  • uri (string): URI oder Pfad, der dem Stream zugeordnet ist.

Beispiele

Timeout-Erkennung bei einem TCP-Socket

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

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

// Timeout für den Stream auf 2 Sekunden setzen
stream_set_timeout($socket, 2);

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

// Antwort lesen
$response = fread($socket, 1024);

// Status des Streams prüfen
$status = socket_get_status($socket);

if ($status['timed_out']) {
    echo "Timeout: Der Server hat nicht rechtzeitig geantwortet.\n";
} else {
    echo "Antwort erhalten, EOF: " . ($status['eof'] ? 'ja' : 'nein') . "\n";
    echo "Ungelesene Bytes im Puffer: " . $status['unread_bytes'] . "\n";
}

fclose($socket);
Antwort erhalten, EOF: nein Ungelesene Bytes im Puffer: 0

Metadaten eines HTTP-Streams mit Wrapper-Daten

<?php
// HTTP-Stream über den http-Wrapper öffnen
$stream = fopen('http://www.example.com/', 'r');

if ($stream === false) {
    echo "Stream konnte nicht geöffnet werden.\n";
    exit;
}

// Metadaten auslesen (Alias von stream_get_meta_data)
$meta = socket_get_status($stream);

echo "Stream-Typ: " . $meta['stream_type'] . "\n";
echo "Wrapper-Typ: " . $meta['wrapper_type'] . "\n";
echo "Modus: " . $meta['mode'] . "\n";
echo "Suchbar: " . ($meta['seekable'] ? 'ja' : 'nein') . "\n";

// HTTP-Antwort-Header ausgeben
if (isset($meta['wrapper_data'])) {
    echo "\nHTTP-Antwort-Header:\n";
    foreach ($meta['wrapper_data'] as $header) {
        echo "  $header\n";
    }
}

fclose($stream);
Stream-Typ: tcp_socket/ssl Wrapper-Typ: http Modus: r Suchbar: nein HTTP-Antwort-Header: HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 ...

// Wichtig · Fallstricke

Alias-Warnung: socket_get_status() ist ein Alias von stream_get_meta_data(). Es wird empfohlen, stattdessen stream_get_meta_data() direkt zu verwenden, da Aliase in zukünftigen PHP-Versionen ohne Vorwarnung entfernt werden können.

Nicht zu verwechseln mit Socket-Erweiterungsfunktionen wie socket_last_error(), die mit Socket-Objekten der sockets-Erweiterung arbeiten. socket_get_status() arbeitet ausschließlich mit Stream-Ressourcen (resource), nicht mit Socket-Objekten.

Das Feld wrapper_data ist nur bei Streams vorhanden, die über einen Wrapper (z. B. http://, ftp://) geöffnet wurden. Bei einfachen Datei-Streams ist es möglicherweise nicht gesetzt.