Thread Erfahrung mit SpeedyCGI (19 answers)
Opened by marky at 2011-06-16 18:26

roooot
 2011-07-20 16:37
#150618 #150618
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Bei mir sieht das wie folgt aus:
Code (perl): (dl )
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 {
        
        # validate if fast cgi is available
        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;
        };        
        
        # setup disptacher
        my $disp = $self->_get_dispatcher;
        $disp->setup;
        
        # fcgi loop
        
        $ENV{'_persistent'} = 1;
        
        while (my $cgi = new CGI::Fast) {            
            $ENV{'_start_time'} = Benchmark->new; # reset timer  
            $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:
Code (perl): (dl )
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. CPAN: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 :)

View full thread Erfahrung mit SpeedyCGI