Start · Sprachen · PHP · Referenz · socket_import_stream

socket_import_stream

Funktion

Importiert einen PHP-Stream und gibt ein <code>Socket</code>-Objekt zurück, das denselben zugrundeliegenden Socket repräsentiert.

seit PHP 5.4.0 Kategorie: http

Signatur

socket_import_stream(resource $stream): Socket|false

Beschreibung

socket_import_stream() wandelt einen bestehenden PHP-Stream-Ressource (z. B. aus stream_socket_client() oder stream_socket_server()) in ein Socket-Objekt um, das mit den Funktionen der ext/sockets-Erweiterung verwendet werden kann.

Dies ist besonders nützlich, wenn man einen Stream z. B. mit der flexiblen stream_socket_client()-API öffnet, anschließend aber auf Low-Level-Socket-Optionen zugreifen möchte, die nur über Funktionen wie socket_get_option(), socket_set_option() oder socket_getsockname() verfügbar sind.

Wichtig: Stream und Socket-Objekt teilen sich denselben internen Socket-Deskriptor. Beide Handles beziehen sich auf dieselbe Verbindung; Änderungen über das eine Objekt wirken sich auf das andere aus. Das Schließen des Streams schließt auch die zugehörige Socket-Verbindung.

Die Funktion setzt voraus, dass die ext/sockets-Erweiterung geladen ist. Ab PHP 8.0 gibt sie ein Socket-Objekt zurück, in früheren Versionen war es eine Ressource vom Typ resource (Socket).

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Ein PHP-Stream-Handle, typischerweise erzeugt durch stream_socket_client(), stream_socket_server() oder fsockopen(). Muss ein echtes Socket-basiertes Stream-Handle sein.

Rückgabewert

Typ
Socket|false
Beschreibung
Gibt bei Erfolg ein Socket-Objekt zurück (vor PHP 8.0 eine Socket-Ressource), das denselben Socket wie der übergebene Stream repräsentiert. Im Fehlerfall wird false zurückgegeben, z. B. wenn der Stream kein Socket-Stream ist.

Beispiele

TCP-Verbindung öffnen und Socket-Option setzen

<?php
// Stream mit stream_socket_client() öffnen
$stream = stream_socket_client('tcp://example.com:80', $errno, $errstr, 5);

if ($stream === false) {
    die("Verbindung fehlgeschlagen: $errstr ($errno)");
}

// Stream in ein Socket-Objekt importieren
$socket = socket_import_stream($stream);

if ($socket === false) {
    die('socket_import_stream() fehlgeschlagen');
}

// TCP_NODELAY aktivieren (Nagle-Algorithmus deaktivieren)
socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1);

// Prüfen ob die Option gesetzt ist
$val = socket_get_option($socket, SOL_TCP, TCP_NODELAY);
echo 'TCP_NODELAY: ' . $val . PHP_EOL;

// HTTP-Anfrage über den normalen Stream senden
fwrite($stream, "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n");
$response = fread($stream, 1024);
echo substr($response, 0, 100) . PHP_EOL;

fclose($stream); // Schließt auch den Socket
TCP_NODELAY: 1 HTTP/1.0 200 OK ...

Socket-Adresse und Port nach dem Verbindungsaufbau ermitteln

<?php
// Stream zu einem lokalen Server aufbauen
$stream = stream_socket_client('tcp://127.0.0.1:8080', $errno, $errstr, 3);

if ($stream === false) {
    die("Fehler: $errstr ($errno)");
}

$socket = socket_import_stream($stream);

if ($socket !== false) {
    // Lokale Adresse des Sockets ermitteln
    socket_getsockname($socket, $address, $port);
    echo "Lokale Adresse: $address:$port" . PHP_EOL;

    // Gegenstelle ermitteln
    socket_getpeername($socket, $peerAddress, $peerPort);
    echo "Verbunden mit: $peerAddress:$peerPort" . PHP_EOL;
}

fclose($stream);
Lokale Adresse: 127.0.0.1:54321 Verbunden mit: 127.0.0.1:8080

// Wichtig · Fallstricke

Gemeinsamer Deskriptor: Stream und Socket-Objekt teilen denselben Datei-Deskriptor. Es ist wichtig, den Stream nicht zu schließen, solange noch über das Socket-Objekt gearbeitet wird, da dies die Verbindung trennt.

Erweiterungsabhängigkeit: Die Funktion gehört zur ext/sockets-Erweiterung, die nicht immer standardmäßig aktiviert ist. Stelle sicher, dass extension=sockets in der php.ini aktiviert ist.

PHP 8.0+: Ab PHP 8.0 gibt die Funktion ein Socket-Objekt zurück. In älteren PHP-Versionen war der Rückgabetyp eine Ressource. Code, der die Ressource weitergibt, muss für PHP 8+ nicht zwingend angepasst werden, da die Socket-Funktionen beides akzeptieren.

Nur Socket-Streams: Der übergebene Stream muss ein Socket-basierter Stream sein. Datei-Streams (z. B. durch fopen() geöffnete Dateien) werden nicht unterstützt und führen zu false.