Time Problem bei @fsockopen
simone
- php
Hallo liebes Forum!
Mein Problem:
Ich möchte eine Abruchbedingung in einer @fsockopen Verbindung einbauen.
$fp = @fsockopen ($ip, $port, $errno, $errstr, 20);
sollte nach 20 sekunden die verbindung trennen. was es aber nicht macht! dieser fehler tritt nicht regelmäßig auf.
jetzt habe ich eine kleine funktion geschrieben die ausführungszeit innerhalb
der schleife messen kann.
while (!feof($fp)) {
$content .= @fgets ($fp,128);
$a++;
if ($a == 5)
{
messe Zeit
und mache ein break; wenn zeitlimit überschritten
}
......
}
jedoch führt der schleifenabruch nicht zu eine fsockopen ende!
( auch @fclose ($fp); wurde berücksichtigt)
was kann ich machen um ein sofortigen abruch zu erreichen?
Danke Simone
Hallo Simone!
was kann ich machen um ein sofortigen abruch zu erreichen?
mir fiele spontan nur ein die PID zu ermitteln (POSIX-Erweiterung, oder über einen Shell-Prozess) und den gesamten Prozess abzuschießen. Allerdings reagiert ein Webserver darauf mit 500 Internal Server Error. Diesen könnte man mit einem ErrorDocument händeln, aber schön ist was anderes.
Du könntest auch den Server selbst aufrufen und eine Quasi-Prozessgabelung veranstalten http://forum.de.selfhtml.org/archiv/2004/8/t88104/, in dem Du die eigentliche Arbeit der Verbindung von einer anderen Script erledigen läßt. Allerdings ist dies kein Allheilmittel, da zwei Anfragen zum erledigen eines Requests auf den Server zu kommen und die beiden Prozesse miteinander kommunizieren müssen.
Die Kommunikation könnte im einfachsten Fall über eine auf die Festplatte geschriebene Datei funktionieren (, aber auch über eine Semaphor).
Die dabei entstehende Gefahr, liegt in verschleppten Prozessen, die das gesamte System allmählig festfahren lassen, wenn bei der Programmierung nicht hundertprozenig dafür Sorge getragen wird, daß alle Prozesse auch wieder beendet werden.
Gruß aus Berlin!
eddi
Hallo eddi
Danke für Deine Antwort!
Ich habe gestern mir vorstellbaren Abruchprozeduren überdacht und teilweise ausprobiert.
Meine Vorstellung:
$status= stream_get_meta_data($fp);
$status zeigt mir die aktuellen Werte.
while (!feof($fp)
geht bis zum Ende der Datei
und schließt dann erst das Auslesen ab.
soweit so gut.
erzeuge ich ein küstlichen Abruch ( nach 10s Skriptlaufzeitbegrenzung )
steht der Dateizeiger nicht auf dem Ende! es kommt zwangsläufig beim Abruch zu einen Laufzeitfehler
Sollte es mir gelingen feof ein true zu simulieren
dürfte demnach das Skript ordentlich beendet werden.
und alles wird gut ;))
Jedoch gibt es keine mir bekannte Möglichkeit das erreichen des Dateiendes zu simulieren. bzw. feof auf true zu setzen.
Vielleicht kann mir Jemand hier Forum helfen.
PS:
Ich denke es ist was für die PHP Programmierer dort nochmal die Funktionsweise (socked) zu überdenken.
Alternativ:
Ich denke ich werde die Ganze Sache mit einem externen Skript lösen und dort das set time limit auf 20s stellen dann bekomme ich halt einen 500 Fehler zurück den ich dannach auswerten kann. Erscheint mir aber ganz schon unsauber!......
Simone
Hallo Simone,
Alternativ:
Ich denke ich werde die Ganze Sache mit einem externen Skript lösen und dort das set time limit auf 20s stellen dann bekomme ich halt einen 500 Fehler zurück den ich dannach auswerten kann. Erscheint mir aber ganz schon unsauber!...
Warum sollte ein timeout einen Internal Server Error (500) hervorrufen?
Gruß aus Berlin!
eddi
hallo eddi
Natürlich hast du recht das ein timout keinen 500 erzeugt.
Aber was letzendlich zum Abruch führt ist doch egal.
enthalten ist ein jedoch ein auswertbarer request:
Fatal error: Maximum execution time of ....
@dedlfix
werde ich versuchen danke für den Tipp!
Simone
» while (!feof($fp)
Hast du vielleicht das Problem, das "rob at robhulme dot com" in http://de3.php.net/manual/de/function.fsockopen.php schildert?