Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Arno Welzel Newsgroups: de.comp.lang.php Subject: =?UTF-8?Q?Re=3a_fget_mit_unbekannt_L=c3=a4nge_einlesen?= Date: Wed, 28 Oct 2020 21:11:47 +0100 Lines: 68 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net FXEwrZCrQiNHooS6OB9eSgzlnimWdiwxeX80CxPk2HuGDnB429 Cancel-Lock: sha1:y5EZzTy6VDpLcrHbTAAqcXTCrto= In-Reply-To: Xref: csiph.com de.comp.lang.php:4618 Timo S.: > Guten Morgen, > > ich sitze gerade an einer Funktion mit fsockopen, > die von eine Liste mit Fehlern von einem Serverport abfragt. > > Dabei steht jeder Fehler in einer eigenen Zeile und die Liste > der Fehler ist mal leer und auch mal schnell mehrere hundert Zeilen groß. > > Wie bringe ich PHP bzw. fgets dazu, alles einschließlich der letzten > Zeile in die Variable $ErrorList_Response zu schreiben. > Aktuell wird nur die erste Zeile in $ErrorList_Response gespeichert. > > Meine Abfrage der Zeile sieht wie folgt aus: > > fputs( $smtpConnect, "LIST" . $newLine ); > $ErrorList_Response .= fgets( $smtpConnect, 1024 ); > > Hat jemand eine Idee und einen Lösungsansatz für mich? Generell wäre socket_read() dafür sinnvoller. Ganz simpel: $ErrorList_Response .= socket_read($smtpConnect, 1024); Wobei 1024 ja auch zu wenig sein könnte: $ErrorList_Response .= socket_read($smtpConnect, 16384); Die ausführlichere Variante: $done = false; $timeOut = 10; $data = ''; while (!$done && $timeOut > 0) { $listRead = [$smtpConnect]; $listWrite = null; $listExcept = null; $socketRead = @socket_select($listRead, $listWrite, $listExcept, 1); if($socketRead) { $runtime = 0; $buffer = socket_read($smtpConnect, 8192); if (strlen($buffer) > 0) { $data .= $buf; } else { $done = true; } } else { $timeOut--; } } Die Idee dabei: Man fragt mit socket_select() ab, ob am Socket noch etwas zu lesen und vermeidet so einen Hänger, wenn der angesprochene Server nichts zurückschickt. Wenn etwas bereitsteht, liest dann bis zu 8 KB ein. Wenn es nichts mehr zu lesen gibt, gibt man dem Sender noch maximal 10 Sekunden Zeit und bricht dann ab - wobei man jeweils einmal pro Sekunde prüft. -- Arno Welzel https://arnowelzel.de