ich hardere mittlerweile seit einigen Tagen mit einem Problem, das zwar durchaus in einigen Foren beschrieben, aber bisher nie mit einer funktionierenden Loesung beschrieben steht. Zudem sind die meisten Threads dazu alle einigen Jahre alt.
Konkret geht es um die Funktion socket_read. In einem Programm habe ich bisher immer eine ueberschaubare Anzahl an Bytes ausgetauscht, sodass das Einlesen von 1024 Bytes $buf = socket_read($socket, 1024, PHP_BINARY_READ) immer ausreichend war. Jetzt hat sich das Anforderungsprofil jedoch veraendert, sodass eine beliebige Anzahl an Bytes eingelesen werden muss. Die natuerliche Loesung ist, socket_read in einer Schleife solange aufzurufen, bis der Buffer leer ist; wobei dies auch bereits die kritische Stelle ist, da PHP genau dies nicht zu erkennen scheint. Dies laesst sich sehr schnell verdeutlichen, wenn man jeweils nur eine Laenge von 10 oder 20 Bytes einliest.
Hier sind die zwei exemplarischen Ansaetze, die ich im Netz zwar gefunden habe, aber die jedoch leider alle nicht funktionieren (aus Auskommentierte diente mir zu Debugzwecken):
PHP-Code:
/*
$reply = "";
do {
$recv = "";
$recv = @ socket_read($socket, '20');
if ($recv != "") {
$reply .= $recv;
}
} while ($recv != "");
*/
PHP-Code:
while(($out=@socket_read($socket, 10, PHP_NORMAL_READ)) !== FALSE) {
// if ($out === FALSE) {
// continue;
// }
// $out = @socket_read($socket, 10);
$foo .= $out;
//if (empty($out)) {
// break;
// }
if ($i == 80)
die(var_dump($foo2));
// if (strlen($out) < 10)
// break;
if (strlen($out) == 0) { break; }
$i++;
}
PHP-Code:
if (strlen($out) < 10)
break;
Die Hinweise hier PHP: socket_read - Manual haben leider auch nicht zielfuehrend weitergeholfen. Bei den obigen Scriptauszuegen wird die Endlosschleife immer erst dann unterbrochen, wenn der sendende Client beendet wird (CTRL+C).
Einige User haben irgendwann einfach fsockopen() verwendet, als sie offensichtlich nicht weitergekommen sind. Das ganze geht in meinem Fall leider nicht, da es sich hier um einen Socket Server handelt, der eine beliebige Menge an Daten einlesen koennen muss.
Ueber jegliche Ideen wuerde ich mich sehr freuen,
dertechniker
Einen Kommentar schreiben: