Signatur
Beschreibung
socket_export_stream() wandelt ein Socket-Objekt (erzeugt z. B. mit socket_create()) in eine PHP-Stream-Ressource um. Diese Stream-Ressource kann anschließend mit allen regulären PHP-Stream-Funktionen wie fread(), fwrite(), stream_set_timeout() oder stream_select() genutzt werden.
Dies ist besonders nützlich, wenn Code vorliegt, der Streams erwartet (etwa Bibliotheken, die mit resource-Typen arbeiten), aber eine Low-Level-Socket-Verbindung mit socket_create() aufgebaut wurde. Anstatt die Socket-Implementierung komplett umzuschreiben, kann der Socket einfach in einen Stream exportiert werden.
Der exportierte Stream übernimmt das Eigentum am Socket. Das bedeutet, dass der Socket nicht separat mit socket_close() geschlossen werden sollte, sobald der Stream aktiv ist — das Schließen des Streams übernimmt diese Aufgabe automatisch.
Achtung: Der exportierte Stream ist abhängig von der ursprünglichen Socket-Konfiguration. Nicht-blockierende Einstellungen, die zuvor über socket_set_nonblock() gesetzt wurden, bleiben erhalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $socket Pflicht | Socket | Ein gültiges Socket-Objekt, das zuvor mit socket_create() oder einer ähnlichen Funktion erstellt wurde. |
Rückgabewert
false bei einem Fehler.Beispiele
TCP-Socket in Stream exportieren und lesen/schreiben
<?php
// TCP-Socket erstellen und mit einem Server verbinden
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}
if (!socket_connect($socket, 'example.com', 80)) {
die('socket_connect() fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}
// Socket in einen Stream exportieren
$stream = socket_export_stream($socket);
if ($stream === false) {
die('socket_export_stream() fehlgeschlagen');
}
// HTTP-Anfrage über den Stream senden
fwrite($stream, "GET / HTTP/1.0\r\nHost: example.com\r\nConnection: close\r\n\r\n");
// Antwort lesen
$response = '';
while (!feof($stream)) {
$response .= fread($stream, 4096);
}
echo substr($response, 0, 200);
// Stream schließen (schließt auch den Socket)
fclose($stream);
Timeout auf exportiertem Stream setzen
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);
$stream = socket_export_stream($socket);
if ($stream === false) {
die('Export fehlgeschlagen');
}
// Timeout von 5 Sekunden setzen — nur möglich über Stream-API
stream_set_timeout($stream, 5);
// Daten schreiben
fwrite($stream, "Hallo Server\n");
// Antwort lesen
$antwort = fgets($stream);
$info = stream_get_meta_data($stream);
if ($info['timed_out']) {
echo "Verbindung hat Timeout überschritten.\n";
} else {
echo "Antwort: " . $antwort;
}
fclose($stream);
// Wichtig · Fallstricke
Eigentümerschaft: Nach dem Aufruf von socket_export_stream() übernimmt der Stream das Eigentum am zugrunde liegenden Socket. Ein nachträglicher Aufruf von socket_close() auf demselben Socket-Objekt kann zu undefiniertem Verhalten oder doppeltem Schließen führen.
Plattformabhängigkeit: Das Verhalten des exportierten Streams kann je nach Betriebssystem und PHP-Build leicht variieren, insbesondere bei nicht-blockierenden Sockets unter Windows.
Verfügbarkeit: Diese Funktion ist erst ab PHP 7.0.7 verfügbar. In älteren PHP-Versionen gibt es keine direkte Entsprechung.