Markus Trusk: Wird Riesenperlscript auf einmal geladen?

Hi,
ich habe eine grundsätzliche Frage und zwar wird mein Script bei Fertigstellung um die 100KByte haben (Ist ja auch ein ziemlich umfangreiches Board mit Upload, Textgestaltung usw). Auf jeden Fall wollte ich wissen, wie das Wechselspiel zw Client und Server funktioniert. Ladet der Client die ganzen 100KByte auf einmal, oder bekommt der Client nur das zugeschickt, was gerade vom Server ausgegeben wird? Es ist mir klar, dass der Server das Script irgendwie zuerst auf Fehler überprüft, wenn dieses gestartet wird, und dann natürlich die ganzen 100K durchgehen muss, aber stelle ich mir das richtig vor, dass der Client nur die aus dem Perlscript generierte HTML Seite laden muss und nicht zuerst irgendwie das ganze Script "runterladet", oder wie genau funktioniert das intern?

Markus Trusk.

  1. Hallo Markus Trusk,

    ... aber stelle ich mir das richtig vor, dass der Client nur die aus dem Perlscript generierte HTML Seite laden muss

    Ja, oder besser: laden kann. Er bekommt nichts anderes.

    und nicht zuerst irgendwie das ganze Script "runterladet", oder wie genau funktioniert das intern?

    Nur in einem Unglücksfall sollte der Browser das Script zu
    Gesicht bekommen. Browser haben zumeist keine Ahnung von Perl,
    auch nicht von PHP, nicht einmal von C oder sonst einer Sprache,
    in der ein CGI-Script geschrieben werden kann.

    Prinzipielle Funktionsweise:

    1. Ein CGI-Script erzeugt ein HTML-Dokument, ggf. mit JavaScript,
       vielleicht auch dynamisch erzeugte Grafiken ...
    2. Dieses sendet der Webserver zum Browser, typischerweise
       bereits während der Erzeugung und nicht erst nach Abschluß
      (ggf. erst nach Pufferung einer bestimmten Ausgabemenge)
    3. Der Client zeigt das HTML-Dokument an.
       Der Client merkt nichts davon, dass dieses dynamisch erzeugt
       wurde.
    4. Falls der Nachschub stockt, weil das Skript lange braucht, um
       weiteres HTML zu erzeugen oder eine komplexe Tabelle aufgebaut
       wird, dann stockt auch die Anzeige im Browser

    Außerdem: Stell Dir vor, Du schreibst ein Skript in Perl und der
    Großteil Deiner Seitenbesucher kann Deine Seite nicht benutzen.
    weil er als Otto Windows-Normalbenutzer Perl nicht installiert hat.

    Freundliche Grüsse,

    Vinzenz

    1. Hi,
      die Funktionsweise von CGI ist mir schon klar. Das, was mich eben interessiert war, wie das Perlscript durchgecheckt wird (sonst hätte ich doch nur dann einen Internal Server Error, wenn das Script an der Zeile ankommt, wo der Fehler passiert), aber eigentlich ist es eh logisch. Ich lade ja nicht das Perl herunter. Naja ist schon spät heute :)

      Markus Trusk.

  2. Hello,

    Google nochmal nach "Client Server Technik".

    Die Ressource wird vom Client beim Server angefordert. Wenn es sich um ein zu interpretierendes Script handelt, wird der Webserver es an das entsprechende Modul oder den Interpreter übergeben und auswerten lassen. Alle Ausgaben auf die Standardausgabe (in diesem Falle der Port, über den der Browser angefragt hat) werden dem Browser gesendet.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  3. Hi Markus,

    der größte Overhead entsteht am Server, wenn das CGI Script geladen wird. Und dabei spielt die Größe eines Scripts auf jeden Fall eine Rolle, ähmm, 100 KB - da warst du auf jeden Fall fleißig am Tippen ;-)

    Zurück zum Overhead - aus meiner Praxis:

    5 Benutzer / s laden ~5 KB Dateien statisch - kein Problem für einen etwas schwach beseideten Rechner p133 / 128 MB

    Nun: diese 5 K - Dateien über ein CGI geladen auf derselben HW: die Kiste ging total in die Knie.

    Abhilfe: FastCGI. Wie's geht steht auf der PerlBase.

    Gute Nacht, Rolf

    --
    SELFforum - Das Tor zur Welt!
    Theoretiker: Wie kommt das Kupfer in die Leitung?
    Praktiker: Wie kommt der Strom in die Leitung?
    1. Hi,
      Das Problem bei dem Script ist, dass ich es nicht sehr gut aufteilen kann, da ich nicht will, dass man ohne Einloggen irgendwelche Unterscripts laden kann. Vielleicht werde ich am Schluss noch einen Teil irgendwie mit require importieren, aber dann leidet erstens wieder die Lesbgarkeit daran, und 2. wäre es nicht schneller, wenn ich die Daten zusammen lasse und nicht mit require importiere, weil ich kann mir vorstellen, dass das ständige importieren für Perl auch ganz schön Arbeit ist?
      Außerdem ist es ja nicht so, dass mein Webspace der Langsamste ist, aber je länger es wird, desto murmliger wird mein Gefühl dabei. Immerhin importiere ich auch 8 Perl Module zugleich (strict, CGI, CGI::Session, CGI::Cookie, CGI::Carp, DBI, HTML::Entities, Image::Size)

      Markus Trusk.

      1. Hallo Markus,

        Immerhin importiere ich auch 8 Perl Module zugleich (strict, CGI, CGI::Session, CGI::Cookie,
        CGI::Carp, DBI, HTML::Entities, Image::Size)

        strict ist ein Pragma, kein Modul. Weitere Pragmas sind 'warnings' und 'diagnostics'.

        Grüße,
         CK

        --
        <zentrum> wie war noch mal die option in make.conf fuer das benutzen von pipes um das compile zu beschluenigen?
        <CK1> CFLAGS="-pipe"
        <torsten> Oder man frage einen Gentooer seiner Wahl, wie man 2 km Compilerswitches fuer seine CPU hinbekommt ;)
      2. Das Problem bei dem Script ist, dass ich es nicht sehr gut aufteilen kann, da ich nicht will, dass man ohne Einloggen irgendwelche Unterscripts laden kann. Vielleicht werde ich am Schluss noch einen Teil irgendwie mit require importieren, aber dann leidet erstens wieder die Lesbgarkeit daran, und 2. wäre es nicht schneller, wenn ich die Daten zusammen lasse und nicht mit require importiere, weil ich kann mir vorstellen, dass das ständige importieren für Perl auch ganz schön Arbeit ist?

        Wie gesagt du solltest deine Anwendung in Module unterteilen, nicht in Unterskripts. Dann wird es übersichtlicher und kann ein CGI skript schneller machen. aber wenn dein Skript ein monolithischer Block ist, bringt es natürlich nichts das zu unterteilen.

        Mit einloggen oder nicht hat das auch nichts zu tun. Ich mach das z.b. so ähnlich:

        Es gibt eine: index.pl

        my $action_liste = {
        action_1 => { modul => 'modul_1.pl', funktion => 'func_1'},
        action_2 => { modul => 'modul_2.pl', funktion => 'func_2'},
        ....

        };

        use Login;

        my $user = Login();
        my $action = param('a');
        my $modul = $action_liste->{$action}->{modul};

        Das sieht nicht wirklich so aus, soll nur zeigen was ich meine. Du musst hier natrülich prüfen, darf der User das? existiert das Modul? usw.

        require $modul
        my $func = $action_liste->{$action}->{funktion};

        &$func();

        und in den Modulen bindest du die notwendigen Bibliotheken ein.

        Struppi.

  4. ich habe eine grundsätzliche Frage und zwar wird mein Script bei Fertigstellung um die 100KByte haben (Ist ja auch ein ziemlich umfangreiches Board mit Upload, Textgestaltung usw). Auf jeden Fall wollte ich wissen, wie das Wechselspiel zw Client und Server funktioniert. Ladet der Client die ganzen 100KByte auf einmal, oder bekommt der Client nur das zugeschickt, was gerade vom Server ausgegeben wird? Es ist mir klar, dass der Server das Script irgendwie zuerst auf Fehler überprüft, wenn dieses gestartet wird, und dann natürlich die ganzen 100K durchgehen muss, aber stelle ich mir das richtig vor, dass der Client nur die aus dem Perlscript generierte HTML Seite laden muss und nicht zuerst irgendwie das ganze Script "runterladet", oder wie genau funktioniert das intern?

    Grundsätzlich wird das Perl skript nur auf der Server seite bearbeitet. Der Client hat nichts damit zu tun. Der internal Error kommt z.b. daher, das wenn dein Skript einen Fehler enthält es keinen gültigen Header schickt und nicht weil der Client merkt das das programm einen Fehler enthält.

    100KB ist wohl nicht übermäßig viel. Aber gerade bei der CGI Programmierung solltest du dir um Modulasierung Gedanken machen. Da du ja nicht bei jedem Aufruf alle Funktionalität brauchst. Also wenn ich das Forum lese muss dein Skript vermutlich wesentlich weniger machen als wenn ich etwas reinschreibe. Ich habe mir angewöhnt zur Laufzeit mit require die nötigen Module zu laden. Es gibt aber auch u.a. die Möglichkeit verschiedenen Skripte aufzurufen. z.b. read.pl und write.pl

    Struppi.

    1. Hi,
      Ich wollte es zwar in mehrere Dateien auslagern, nur wusste ich nicht, wie ich am besten Parameter mit require o.ä. übergeben kann und bevor ich da herumfrickle, machte ich es lieber klassisch.

      Markus Trusk.

      1. Ich wollte es zwar in mehrere Dateien auslagern, nur wusste ich nicht, wie ich am besten Parameter mit require o.ä. übergeben kann und bevor ich da herumfrickle, machte ich es lieber klassisch.

        Du kannst an jeder Stelle in jedem Modul mit CGI::param('name') Parameter abfragen. Funktionen sollten natürlich dir entsprechenden Parameter haben um ihre aufgabe zu erfüllen.

        Klassisch ist es insofern, das wenn du einen Datei für alle Möglichkeiten hast, dein Konzept so ist, als ob du ein z.b. C-Programm schreibst (und selbst dort wird eigentlich der Quellcode in viele in winzige Dateien gepackt nur das fertige binary ist eine Datei).
        Klassisch für CGI Anwendungen ist wohl eher für jede Funktion ein Skript.

        Aber ich frag mich warum du hier fragst - offensichtlich haben dich Zweifel an deinem Konzept gepackt - aber du willst nicht Ratschläge umsetzten, bzw, sieht es für mich immer so aus, das du es sowieso so machen willst du es machst.

        Struppi.