Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.php > #4618

Re: fget mit unbekannt Länge einlesen

From Arno Welzel <usenet@arnowelzel.de>
Newsgroups de.comp.lang.php
Subject Re: fget mit unbekannt Länge einlesen
Date 2020-10-28 21:11 +0100
Message-ID <hvu1k3Fj2roU1@mid.individual.net> (permalink)
References <rnb9fp$3q7$1@news.dns-netz.com>

Show all headers | View raw


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

Back to de.comp.lang.php | Previous | NextPrevious in thread | Find similar


Thread

fget mit unbekannt Länge einlesen "Timo S." <usenetpostfach@host4admin.de> - 2020-10-28 09:17 +0100
  Re: fget mit unbekannt Länge einlesen k@rl.pflaesterer.de (Karl Pflästerer) - 2020-10-28 15:17 +0100
    Re: fget mit unbekannt Länge einlesen Timo <usenetpostfach@host4admin.de> - 2020-10-28 17:11 +0100
  Re: fget mit unbekannt Länge einlesen Arno Welzel <usenet@arnowelzel.de> - 2020-10-28 21:11 +0100

csiph-web