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


Groups > de.comp.lang.php > #4613 > unrolled thread

fget mit unbekannt Länge einlesen

Started by"Timo S." <usenetpostfach@host4admin.de>
First post2020-10-28 09:17 +0100
Last post2020-10-28 21:11 +0100
Articles 4 — 4 participants

Back to article view | Back to de.comp.lang.php


Contents

  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

#4613 — fget mit unbekannt Länge einlesen

From"Timo S." <usenetpostfach@host4admin.de>
Date2020-10-28 09:17 +0100
Subjectfget mit unbekannt Länge einlesen
Message-ID<rnb9fp$3q7$1@news.dns-netz.com>
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?

Vielen Dank.

Gruß
Timo

[toc] | [next] | [standalone]


#4616

Fromk@rl.pflaesterer.de (Karl Pflästerer)
Date2020-10-28 15:17 +0100
Message-ID<m1361y1ll3.fsf@mbp.pflaesterer.de>
In reply to#4613
"Timo S." <usenetpostfach@host4admin.de> writes:

> 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?

Hast du https://www.php.net/fsockopen gelesen? In der while Schleife
liest du alle Zeilen ein

KP

[toc] | [prev] | [next] | [standalone]


#4617

FromTimo <usenetpostfach@host4admin.de>
Date2020-10-28 17:11 +0100
Message-ID<rnc56m$3cv$1@news.dns-netz.com>
In reply to#4616
Am 28.10.2020 um 15:17 schrieb Karl Pflästerer:
> Hast du https://www.php.net/fsockopen gelesen? In der while Schleife
> liest du alle Zeilen ein
> 
> KP
> 

Wenn ich die Abfrage in eine Whileschleife lege,
wird das ganze zur Endlosschleife und bricht ab.

Das Script sieht im gesamten wie folgt aus:

$DataServer = "lhennen01.intra.xxxxxxxxxxxx.xx";
$DataPort = "1020";
$timeout = "20";

$username = "snadmin";
$password = "*******";
$newLine  = "\r\n";

$DatapConnect  = fsockopen( $DataServer, $DataPort, $errno, $errstr, 
$timeout );
$DataResponse .= fgets( $DatapConnect, 515 );
	if ( empty( $DatapConnect ) )
	  {
		$output = "Failed to connect: $DataResponse";
		return $output;
	  }

# StallNet Benutzerdaten senden
fputs( $DatapConnect, "AUTHUSER " . $username . $newLine );
$DataResponse .= fgets( $DatapConnect, 256 );
fputs( $DatapConnect, "AUTHPASS " . $password . $newLine );
$DataResponse .= fgets( $DatapConnect, 1024 );

# In die Serviceebene wechseln
fputs( $DatapConnect, "ENABLE SERVICEMODE" . $newLine );
$DataResponse .= fgets( $DatapConnect, 1024 );

# Fehlerliste abfragen
fputs( $DatapConnect, "READ ERRORLIST" . $newLine );
		while (!feof($DatapConnect)) {
			echo fgets($DatapConnect, 1024);
		}

# Fehlerspeicher leeren
#fputs( $DatapConnect, "CLEAR ERRORLIST" . $newLine );
#$DataResponse .= fgets( $DatapConnect, 256);

# Aus der Serviceebene wechseln
fputs( $DatapConnect, "DISABLE SERVICEMODE" . $newLine );
$DataResponse .= fgets( $DatapConnect, 256);

# Aus System abmelden
fputs( $DatapConnect, "QUIT" . $newLine );
$DataResponse .= fgets( $DatapConnect, 256 );

# Verbindung schliessen
fclose( $DatapConnect );



Das ursprüngliche Script, von dem ich dieses abgeleitet habe,
wird für Verbindungen zu einem SMTP genutzt.

Der Zweck für den ich das Script nutzen möchte,
ist von der Befehlübermittlung und auch der Abfrage ähnlich wie SMTP.

Ich habe es auch schon mit einer for-Schleife versucht, dabei ist es 
jedoch so, dass dies funktioniert, solange man weniger Zeilen abfragt,
als die übertragene Liste hat und das Script ist innerhalb einer Sekunde 
durch.

Wenn man bei der for-Schleife jedoch dann mehr Zeilen eingibt bzw. die 
Schleife mindestens einmal zu oft läuft, bekommt man die Fehlermeldung, 
dass bei der Zeile oberhalb der if-Abfrage

$DataResponse .= fgets( $DatapConnect, 515 );

den Fehler, dass $DataResponse nicht definiert ist und das Script bricht 
dann irgendwann ab, obwohl nichteinmal alle Zeilen eingelesen wurde.
Gleiches gilt für die Verwendung mit while-Schleife wie oben im Script.

Leider kann man auf dem System nicht abfragen, wie viele Fehler / Zeilen 
in der Liste sind.

Gruß

Timo

[toc] | [prev] | [next] | [standalone]


#4618

FromArno Welzel <usenet@arnowelzel.de>
Date2020-10-28 21:11 +0100
Message-ID<hvu1k3Fj2roU1@mid.individual.net>
In reply to#4613
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

[toc] | [prev] | [standalone]


Back to top | Article view | de.comp.lang.php


csiph-web