Script läuft zu lange und bricht wegen Timeout ab.
André Mantz
- cgi
Hallo,
ich hoffe, dass ich den Themenbereich richti gewählt habe. Falls nicht, sorry, bin neu hier und fange grade erst an, mit CGI und Perl zu arbeiten.
Nun zu meinem Problem:
Ich habe ein Perl-Script geschrieben, welches ziemlich lange läuft. Es öffnet zeimlich große Dateien, bearbeitet diese und schreibt Ergebnisse in andere Dateien zurück.
Das Script läuft ca. 30 Sekunden ... und genau da liegt das Problem. Wenn ich das Script vom Browser aus aufrufe, dann bricht es manchmal ab, da der Timeout wohl bei 30 sek. liegt, und das Script bis dahin nichts zurückgeliefert hat.
Ich habe probiert, innerhalb der Schleifen einzelne Zeilen auszugeben, damit der Browser ständig Daten erhält. Scheinbar werden diese aber erst dann an den Browser gesendet, wenn das Script durchgelaufen ist, dahin kommt es aber weg. dem Timeout oftmals nicht.
Gibt es eine Möglichkeit, die Ausgabe des Textes an den Browser schon während der Laufzeit des Scripts zu erzwingen?
Danke
André Mantz
Ich habe ein Perl-Script geschrieben, welches ziemlich lange läuft. Es öffnet zeimlich große Dateien, bearbeitet diese und schreibt Ergebnisse in andere Dateien zurück.
Das Script läuft ca. 30 Sekunden ... und genau da liegt das
Ich habe probiert, innerhalb der Schleifen einzelne Zeilen auszugeben, damit der Browser ständig Daten erhält. Scheinbar werden diese aber erst dann an den Browser gesendet, wenn das Script durchgelaufen ist, dahin kommt es aber weg. dem Timeout oftmals nicht.
a) Suche nach einer Funktion namens flush(), die spült alles, was bisher geschrieben wurde, zum Browser. Ich kenn Perl nicht, aber sowas gehört zu jedem gepufferten I/O, also gibt es dort sicher auch derartiges.
b) In PHP werden Skripte automatisch vom -Server- abgebrochen, wenn sie zu lange laufen. Wenn's in Perl genauso läuft, kannst du soviel spülen, wie du willst .) Da hilft dann nur der Gang zum Serverbetreiber mit der Bitte, den Timeout zu erhöhen.
Gruß,
soenk.e
b) In PHP werden Skripte automatisch vom -Server- abgebrochen, wenn sie zu lange laufen. Wenn's in Perl genauso läuft, kannst du soviel spülen, wie du willst .) Da hilft dann nur der Gang zum Serverbetreiber mit der Bitte, den Timeout zu erhöhen.
Gruß,
soenk.e
Hallo Soenke,
erst mal danke für die schnelle Antwort.
Genau so eine Funktion wie das flush() suche ich Perl ... konnte sie aber bisher nicht finden.
Seitens des Servers scheint das Problem nicht zu bestehen, denn wenn ich das Script über Telnet direkt auf dem Server ausführe, dann läuft es auch Problemlos über 30 sek.
Also, wer kann mir sagen, welche Funktion ich nehmen muß, um die Ausgabe an den Browser zu erzwingen?
Danke
André Mantz
Hallo,
Genau so eine Funktion wie das flush() suche ich Perl
perldoc -q flush
perldoc perlvar /$|
Ich nehme an, du kennst perldoc; ansonsten kannst du dich darüber
informieren, indem du perldoc perldoc in deine Shell eintippst.
ad,
kd
Hallo André,
in Perl als auch in PHP gibt es die Funktion sleep(), mit der man die Ausführung eines Skriptes unterbrechen kann. Damit funzen auch länger dauernde Geschichten, wie z.B. E-Mail-Versand aus langen Mailinglisten und so.
MfG
Hartmut R.
Versuchmal:
select STDOUT;
$|=1; # Schreib-Pufferung abschalten
Bye Michael
P.S. Bin mir aber nicht ganz sicher. Missing perldoc .-(
Hallo,
ich hoffe, dass ich den Themenbereich richti gewählt habe. Falls nicht, sorry, bin neu hier und fange grade erst an, mit CGI und Perl zu arbeiten.
Nun zu meinem Problem:
Ich habe ein Perl-Script geschrieben, welches ziemlich lange läuft. Es öffnet zeimlich große Dateien, bearbeitet diese und schreibt Ergebnisse in andere Dateien zurück.
Das Script läuft ca. 30 Sekunden ... und genau da liegt das Problem. Wenn ich das Script vom Browser aus aufrufe, dann bricht es manchmal ab, da der Timeout wohl bei 30 sek. liegt, und das Script bis dahin nichts zurückgeliefert hat.
Ich habe probiert, innerhalb der Schleifen einzelne Zeilen auszugeben, damit der Browser ständig Daten erhält. Scheinbar werden diese aber erst dann an den Browser gesendet, wenn das Script durchgelaufen ist, dahin kommt es aber weg. dem Timeout oftmals nicht.
Gibt es eine Möglichkeit, die Ausgabe des Textes an den Browser schon während der Laufzeit des Scripts zu erzwingen?
Danke
André Mantz
Ich habe probiert, innerhalb der Schleifen einzelne Zeilen auszugeben, damit der Browser ständig Daten erhält. Scheinbar werden diese aber erst dann an den Browser gesendet, wenn das Script durchgelaufen ist, dahin kommt es aber weg. dem Timeout oftmals nicht.
Genau das hat mich (wegen einer viel trivialeren Anwendung, nämlich eines Fortschrittsbalkens - könnte bei dir aber auch passen :) ) zur Verzweiflung getrieben.
Die anderen Tipps hier, den Ausgabepuffer auszuschalten, können schon wirken, müssen aber nicht, denn: Ältere Versionen des Apache ignorieren diese Einstellung. Einzige Abhilfe (und ich habe lange danach gesucht): Der Scriptname muß mit "nph-" beginnen (was wohl für "non parsed header" steht).
Allerdings ist man dann komplett für die HTML-Seitenausgabe verantwortlich, muß also auch den HTTP-Statuscode liefern:
print "HTTP/1.0 200 Okay\n";
print "Content-type: text/html\n\n";
- Sven Rautenberg
1. 30 sek Laufzeit ist für ein CGI-Skript deutlich zu lang.
2. Buffer flush "$| = 1" könnte helfen
3. Bei einem ordentlich aufgesetzten Webserver die Laufzeit eines CGI-Skript limitiert. Da kannste auch nichts dran machen.
Peter
Hallo André
Das Script läuft ca. 30 Sekunden ... und genau da liegt das Problem. Wenn ich das Script vom Browser aus aufrufe, dann bricht es manchmal ab, da der Timeout wohl bei 30 sek. liegt, und das Script bis dahin nichts zurückgeliefert hat.
Unter Unix kannst du mit fork und setsid den Timeout umgehen.
In 2 Zeilen gequetscht sieht dies so aus:
if(fork()) { exit(0); }
POSIX::setsid();
Vorsicht bei Endlosschleifen: Da könnte der Serverbetreiber sehr sauer werden!
Unter </archiv/1999_2/t03884.htm#a18773> wurde auch schon über dieses Thema diskutiert.
Gruss
Andreas