schalabi: groooße Perlscripte!

Hallo Forum!!

Ich will aus verschiedenen Gründen von PHP auf Perl umsteigen bzw. komplexere Dinge nur noch mit Perl erledigen.
Ich will hier aber keine Perl vs. Php Grundsatz-Diskussion führen, sondern habe lediglich eine Frage an die Perlexperten unter uns :-)

Und zwar gibt es in php dieses berühmte index.php Vorgehen, was soviel bedeutet wie: Alle Requests landen in der php. Diese dient als "Verteiler". Die einzelnen Seiten werden dann per include() eingebunden.

Wie macht man sowas in Perl?
Ich möchte gerne Strict programmieren und auf requiere() verzichten um vernünftige Namespaces und Ordnung beizubehalten.

Nun könnte ich natürlich für jede Seite eine Subroutine machen. Das finde ich aber unschön, weil ich nur dasjenige laden will, was auch wirklich im aktuellen Request benötigt wird.

Wie macht ihr sowas?

Leider muss ich die Only-PHP-Leute bitten draußen zu bleiben ;)

  1. Moin Moin!

    Wie macht ihr sowas?

    Statische Resourcen überlasse ich liebend gerne dem Webserver, der ist nämlich wesentlich schneller als alles, was man mit PHP, Perl oder jedem anderen System dazwischenfrickeln kann. Stichwort sendfile().

    Wenn es denn nicht rein statisch geht, werfe ich den Interpreter nicht erst dann an, wenn Holland in Not ist, sondern habe mein Programm bereits fertig zum Ausführen im Speicher. Und damit Fehler im Programm nicht den Webserver töten, läuft das Programm in einem (oder mehreren) eigenen Prozessen, mit denen der Webserver über eine festgelegte Schnittstelle kommuniziert. Stichwort FastCGI.

    Ich trenne Code und Darstellung, anders als z.B. in PHP oder ColdFusion üblich. Stichwort Templates, z.B. mit dem Template-Toolkit.

    Und schließlich sorgt irgendwo im Code ein Dispatcher dafür, dass eingehende Requests eine von mehreren Requesthandler-Klassen erreichen. Die werden meistens tatsächlich erst dann geladen, wenn sie gebraucht werden, per require $filename. Danach bleiben sie "auf Verdacht" im Speicher, bis irgendwann 1.000 oder 10.000 Requests abgearbeitet sind und sich der Anwendungsserver neu startet.

    Und AUF JEDEN FALL laufen meine Perl-Anwendungen im Taint-Modus, wenn sie irgendwie mit dem Netzwerk kommunizieren, d.h. die Scripte beginnen mit #!/usr/bin/perl -T und verifizieren extrem paranoid sämtliche Eingaben, z.B. mit Data::FormValidator.

    Normalerweise schreibt man nicht alles von Null neu, sondern benutzt Frameworks wie Catalyst, CGI::Application, oder meinetwegen Plack.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Hey Alex,

      danke für den ausführlichen Beitrag.
      Mir gehts allerdings weniger um die Programmverwaltung, sondern um die Struktur die einzelne Unterseiten einbinden.
      Ich unterscheide natürlich auch Hypertext von Perl und binde Ersteren mittels HTML::Template::Compiled ein. Die Dokumente befinden sich dann schon vorkompiliert im Cache und warten darauf mit Variablenwerten gefüttert zu werden. Ich mache mir bei den ganzen Modulen lediglich Sorgen hinsichtlich des geplanten Umstiegs von Perl 5 auf 6. Dann stehste siehste nämlich alt aus, wenn deine Module nicht übersetzt werden. Aber lassen wir das :)

      Meine Frage ist eine andere:
      In meiner Community werden viele Dinge getan. Ich muss z.B. auf jeder Seite prüfen, ob derjenige eingeloggt ist oder nicht. D.h. ich muss in jedem Script eine Verbindung zum Session-Modul aufbauen usw. Bei kleinen Programmen ist sowas relativ einfach:

        
      my %public = (  
         'startseite'    => \&startseite,  
         'impressum'     => \&impressum  
      );  
        
      my %secure = (  
         'videos'        => \&videos  
      )  
        
      if (exists $public{$show}) {  
         $public{$show}->(\@args);    # z.B.: $dbh, $cgi, $obj  
      } elsif (exists $secure{$show}) {  
         if ($session) {  
             $secure{$show}->(\@args);  
         } else {  
             print "403 Forbidden";  
         }  
      } else {  
         print "404 Not found";  
      }  
      
      

      Meine Frage ist: O.g. Beispiel ist unperformant da jedesmal die gesamte Datei geladen werden muss, auch wenn nur "impressum" benötigt wird.

      1. Dies liest sich wie die primitive Vorstufe der Runmodes von CGI::Application. Da sollte dir der Umstieg nicht schwerfallen.

        Auf längere Sicht gesehen, bist du mit Catalyst aber besser dran, zumal sich dort statische Inhalte wie deine Impressumsseite, wie von Alexander (HH) schon erwähnt, ohne großes Gefrickel ausliefern lassen. Der Dispatcher sitzt nicht in einer zentralen Datei, sondern wird durch Deklarationen bestimmt; damit bist du deine Sorge aus dem Wurzelposting los. Ist schwer, sowas verständlich in einem Satz darzulegen; arbeite dich einfach ein.

  2. h1,

    Wie macht man sowas in Perl?

    hier mal einer, der es (bisher) ohne Templates macht: ich.

    Ich möchte gerne Strict programmieren und auf requiere() verzichten um vernünftige Namespaces und Ordnung beizubehalten.

    Wie, kein require, kein use??

    Nun könnte ich natürlich für jede Seite eine Subroutine machen. Das finde ich aber unschön, weil ich nur dasjenige laden will, was auch wirklich im aktuellen Request benötigt wird.

    Wie macht ihr sowas?

    Jede angeforderte URL ist aus meiner Sicht ein Objekt mit Eigenschaften.

    Das Staging auf meiner Site kann sein: static, dynamic

    static: HTML Seiten liegen komplett mit eingebauten Properties als Datei vor. Auch die Navigation ist hier eingebaut.

    dynamic: Body (bei mir der dynamische Teil) und Attribute liegen in einer DB, die Seite wird zur Laufzeit zusammengebaut. Dazu wird eine Klasse Basic.pm geladen, die das alles erledigt. Das Laden von Basic wird eingeleitet über ein Loader-Script auf das die RewriteEngine zeigt. Das Loaderscript hat Parameter, weil es auch noch Andere Dinge machen muss, wie z.B. eine JS-Library nachladen, ein sitemap erstellen und auch malne robots.txt ausliefern.

    Und ich bin grad dabei, das alles noch schlanker und flotter zu machen ;-)

    Viele Grüße,
    Rolf