Signatur
Beschreibung
socket_read() liest Daten von einem verbundenen Socket. Die Funktion blockiert standardmäßig so lange, bis Daten verfügbar sind oder der Socket geschlossen wird. Sie eignet sich für den direkten Einsatz mit rohen TCP- oder UDP-Verbindungen, bei denen Daten byteweise oder zeilenweise verarbeitet werden sollen.
Der Parameter mode steuert das Leseverhalten: PHP_BINARY_READ (Standard) liest exakt die angeforderten Bytes aus dem Kernel-Puffer, ohne Interpretation. PHP_NORMAL_READ hingegen bricht den Lesevorgang beim ersten \n- oder \r-Zeichen ab und ist daher für textbasierte Protokolle wie SMTP, POP3 oder einfache Chat-Anwendungen geeignet.
Die Funktion gibt einen leeren String zurück, wenn auf der anderen Seite keine Daten (mehr) verfügbar sind, und false, wenn ein Fehler auftrat. Letzterer lässt sich mit socket_last_error() und socket_strerror() genauer analysieren.
Bei nicht-blockierenden Sockets (gesetzt mit socket_set_nonblock()) kann socket_read() sofort false zurückgeben, wenn noch keine Daten anliegen. In diesem Fall ist der Fehlercode EAGAIN / EWOULDBLOCK zu erwarten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $socket Pflicht | Socket | Eine gültige Socket-Ressource bzw. ein Socket-Objekt (ab PHP 8.0), wie es von socket_create() oder socket_accept() zurückgegeben wird. |
|
| $length Pflicht | int | Maximale Anzahl der zu lesenden Bytes. Der tatsächlich gelesene Datenstrom kann kürzer sein, wenn weniger Daten verfügbar sind oder PHP_NORMAL_READ ein Zeilenende erkennt. |
|
| $mode | int | PHP_BINARY_READ | Lesemodus: PHP_BINARY_READ liest binäre Daten ohne Interpretation; PHP_NORMAL_READ stoppt beim ersten \n oder \r-Zeichen. |
Rückgabewert
false zurück, wenn ein Fehler aufgetreten ist; der genaue Fehler kann mit socket_last_error() abgerufen werden.Beispiele
Einfacher TCP-Client mit PHP_BINARY_READ
<?php
$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, '127.0.0.1', 8080)) {
die('socket_connect() fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}
$request = "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n";
socket_write($socket, $request, strlen($request));
$response = '';
while (true) {
$chunk = socket_read($socket, 2048, PHP_BINARY_READ);
if ($chunk === false) {
echo 'Fehler: ' . socket_strerror(socket_last_error($socket));
break;
}
if ($chunk === '') {
// Verbindung vom Server geschlossen
break;
}
$response .= $chunk;
}
socket_close($socket);
echo $response;
Zeilenweises Lesen mit PHP_NORMAL_READ (z. B. SMTP)
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'mail.example.com', 25);
// Begrüßungszeile des SMTP-Servers lesen
$greeting = socket_read($socket, 1024, PHP_NORMAL_READ);
if ($greeting === false) {
die('Lesefehler: ' . socket_strerror(socket_last_error($socket)));
}
echo 'Server: ' . trim($greeting) . PHP_EOL;
// EHLO senden
$ehlo = "EHLO example.com\r\n";
socket_write($socket, $ehlo, strlen($ehlo));
// Antwort zeilenweise lesen
$line = '';
do {
$line = socket_read($socket, 512, PHP_NORMAL_READ);
if ($line !== false && $line !== '') {
echo 'Server: ' . trim($line) . PHP_EOL;
}
} while ($line !== false && $line !== '' && substr($line, 3, 1) === '-');
socket_close($socket);
// Wichtig · Fallstricke
Blockierendes Verhalten: Im Standard-Modus blockiert socket_read() den PHP-Prozess, bis Daten eintreffen. Bei Server-Anwendungen sollte daher socket_select() vorgeschaltet werden, um nur dann zu lesen, wenn Daten tatsächlich verfügbar sind.
Leerer String vs. false: Es ist wichtig, den Rückgabewert mit === zu vergleichen, da ein leerer String ('') eine geschlossene Verbindung signalisiert, während false einen echten Fehler anzeigt. Ein Vergleich mit == würde beide Fälle fälschlicherweise gleichsetzen.
Pufferung und Fragmentierung: TCP garantiert keine Vollständigkeit des Datenpaketes. Eine einzelne socket_read()-Anweisung kann weniger Bytes liefern als angefordert. Für vollständige Nachrichten muss in einer Schleife gelesen werden.
Sicherheit: Daten, die von einem Socket gelesen werden, kommen aus einer externen Quelle und müssen immer validiert und sanitiert werden, bevor sie weiterverarbeitet, ausgegeben oder in einer Datenbank gespeichert werden.