Bei mir sieht das wie folgt aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
method run_fcgi {
try {
use CGI::Fast;
use FCGI;
}
catch {
print CGI::header;
print CGI::div(q{
sorry, fastcgi is not available on this server.
(missing CGI::Fast or FCGI - could not be loaded)
fix this or run as cgi
});
exit;
};
my $disp = $self->_get_dispatcher;
$disp->setup;
$ENV{'_persistent'} = 1;
while (my $cgi = new CGI::Fast) {
$ENV{'_start_time'} = Benchmark->new;
$ENV{'_persistent'}++;
$disp->route($cgi);
}
}
So wie du siehst, setze ich vor der while Schleife eine Umgebungsvariable $ENV{'_persistent'}. Diese Variable ist ab jetzt IMMER, für jeden Request der kommt 1. Das Hochzählen in der Schleife gibt IMMER, auch nach 100 Aufrufen 2 wieder.
Our Variablen benutze ich nicht, das widerspricht meiner Ansicht nach sauberem, objektorientiertem Programmieren. Dazu kann ich also nichts sagen.
Ich löse bei mir solche Abbrüche anders. Grundsätzlich so wie Java das vorbgibt: Man hat eine ÜBER Funktion main, die einfach nicht abgebrochen werden darf, bzw von Fehlern nichts mitbekommt.
Beispielsweise folgender Aufbau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
sub main {
use Try::Tiny;
use CGI;
print CGI::header;
try {
use Foo;
Foo->new->dosomething;
print "erfolgreich";
}
catch {
print "fehler: ", $_;
}
}
package Foo;
sub dosomething {
die "ooops!";
}
main ist hierbei die Funktion in der FCGI-Schleife. Durch den try-catch-Block wird sichergestellt, dass egal was im Programm passiert nie die Schleife beendet wird, bzw das Programm durch
die oder irgendwas ähnliches abschmieren kann.
Will ich nun in einer Unterfunktion abbrechen, kann ich das durch return (im Erfolgsfall) oder die im Fehlerfall. Ein next oder irgendwie sowas brauche ich nicht.
Fürs debugging bietet sich dann z.b.
Devel::StrackTrace an. Ich empfehle aber eine develop Funktion zu haben, die auf try-catch-Block verzichtet und gar nicht erst als FastCGI laufen soll.
Zu SpeedyCGI unter Squeeze: Ich benutze nicht das Debian Perl, sondern ein selbstkompiliertes, etwas aktuelleres ;) Da muss SpeedyCGI dann extra für kompiliert werden. Dazu kommt noch, dass bei mir alles in nem chroot läuft, was die Sache dann nicht einfacher machte ;) Also habe ich auf das alte Stück Käse verzichtet und es richtig gemacht...
Last edited: 2011-07-20 16:44:37 +0200 (CEST)
Viele Grüße :)