Hallo community,
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):
oder
Das einzige, was das zweite Beispiel nicht in eine Endlosschleife verfallen laesst, ist, wenn ich pruefe, ob die Laenge des zuletzt eingelesenen Buffers kleiner als das Maximale (10 in diesem Fall) ist:
Das ganze halte ich jedoch fuer keine stabile Loesung, da ja zufaellig auch genau 10 Bytes uebertragen werden koennten. Dann wuerde das Script erneut socket_read aufrufen und wieder in die Endlosschleife wandern.
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
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
Kommentar