Signatur
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
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
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);
// 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.