- Die Optimierung von CGI-Programmen durch Libraries
Ein CGI-Programm, wie das oben vorgestellte kann man eigentlich nicht weiter optimieren.
Wenn man allerdings mehrere verschiedene Programme erstellen muss, bietet es sich an Libraries zu
benutzen.
Diese können in Form eines Modules vorkommen, oder einer Perl-Datei, in der bereits nützliche
Subroutinen definiert wurden, die immer wieder benutzt werden.
So könnte man z.B. den Code, der die Eingabedaten entgegennimmt und decodiert in eine eigene
Subroutine schreiben und dann bei Bedarf in unterschiedlichsten CGI-Programmen einfach durch den
Befehl require einfügen.
Somit gelangt man zu einer Library an allgemeinen Funktionen, die die einzelnen CGI-Programme sehr einfach
und transparent (im Sinne des Verdeckens von Implementationsdetails) machen. Eine solche Library ist die
cgi-library.pl. Man bindet sie in
das eigene CGI-Programm durch den folgenden Aufruf ein:
require "/proj/websource/cgi-bin/webadm/cgi-library.pl";
|
Unter anderen folgende Funktionen enthält die cgi-library.pl zur Zeit:
- ReadParse
Nimmt alle Eingaben entgegen und decodiert sie. Eingaben koennen ueber das assosziative Array
$in{} abgefragt werden
- PrintHeader
Signalisiert dem Server das ein HTML-Dokument kommt.
- HtmlTop(titel,bodyflags,kopfhtml)
Setzt Dokument-Titel und -Body, und printed einen definierten Kopf aus.
- HtmlBot(text)
Schreibt einen Endtext und schliesst das HTML-Dokument
- SplitParam
Splittet ein Liste in einzelne Elemente
- CgiError(text)
Gibt eine Fehlermeldung aus
- CgiDie(text)
Wie CgiError, aber beendet das Skript
- PrintVariables
Gibt alle Variablen im assoziativen Array $in{} aus.
- PrintEnv
Zeigt alle Standard-Environment-Variablen an
- Ckeck_Name(dateiname)
Prüft die Variable dateiname nach gefährlichen Zeichen und checkt, ob
der Pfad der Datei erlaubt ist. (Gut, falls der Benutzer die Datei angeben kann)
- Get_Seconds(zeit)
lock(filehandle)
- unlock(filehandle)
Weiterhin enthält die Library einige Standardvariablen, wie z.B. $zeit, $UHR, $HOST, $DATE usw.
Mit Hilfe dieser Library können wir das obige Programm nun verkleinern:
#!/local/bin/perl
# simpleform.cgi Version 1.0
# Dieses Skript nimmt Eingaben aus einer Form entgegen, fügt
# sie an eine vorgegebene Datei an, und zeigt dem Benutzer
# nochmals, was er eingegeben hat.
require "/proj/websource/cgi-bin/webadm/cgi-library.pl"
$dateiname = 'umfrage.dat';
# In die Datei mit den Namen 'umfrage.dat' werd ich meine Daten
# speichern.
&ReadParse;
&HtmlTop("Umfrageauswertung,,");
print "<h2>Vielen Dank für Ihre Informationen.</h2>\n";
print "Sie gaben ein:<hr><dl>\n";
print "<dd>Ihr Lernerfolg war $in{'Lernerfolg'}\n";
print "<dd>Das Tempo der Vorlesung war $in{'Tempo'}\n";
print "<dd>Ihre Vorkenntnisse waren $in{'Vorkenntnisse'}\n";
print "<dd>Ihr Kommentar:<br> $in{'Kommentar'}\n";
print "<p>";
if (($in{'Tempo'} eq 'zu langsam')
&& ($in{'Lernerfolg'} eq 'nichts')) {
print "<br>Du fauler Sack!<br>\n";
}
# No comment here :))
open(filehandle,">>$dateiname")
|| &CgieDie("Kann die Datei $dateiname nicht öffnen!");
&lock(filehandle);
print filehandle "-------Neuer Eintrag-------\n";
print filehandle "Lernerfolg = $in{'Lernerfolg'}\n";
print filehandle "Tempo = $in{'Tempo'}\n";
print filehandle "Vorkenntnisse = $in{'Vorkenntnisse'}\n";
print filehandle "Kommentar: $in{'Kommentar'}\n\n";
&unlock(filehandle);
close filehandle;
&HtmlBot();
# Wir schliessen das HTML-Dokument
exit(0);
|
Neben der cgi-library.pl gibt es noch andere bekannte Module und Libraries. Die cgi-lib.pl
ist eine davon. Die Funktionen dieser Library wurden in die cgi-library.pl übernommen und verbessert.
Eine andere sehr bekannt Library ist die CGI.pm. Hierbei handelt es sich aber
bereits um ein Modul, welches nicht mit require, sondern mit use eingebunden wird.
Der Funktionsumfang dieses Modules ist um einiges größer als das der cgi-library. Allerdings
wird dies auch merkbar durch dessen Länge.
Es ist Sache des CGI-Programmierers, welche Libraries er/sie bevorzugt. Wer sich aber mal im Netz nach
Lösungen zu CGI-Problemen umschaut, wird öfters auf diese oder jene Library oder auf Module treffen.
Deswegen ist es auch -wenn man seine eigenen Libraries benutzt- von Vorteil, wenn man von den anderen zumindest gehört
hat, oder noch besser weiß wo er/sie diese erhalten bzw. darüber lesen kann.
Die Suchmaschinen sind oftmals auf diesem Gebiet recht glücklos. (Wer nach dem Begriff "CGI" sucht, erhät
leider zu oft nur viele, viele Gästebücher und andere Tools, die irgentwo in Ihrem Pfad ein 'cgi' haben.)
Auf der nächsten Seite werd ich deswegen einige Links zu wichtigen Seiten angeben, die dieses Thema vertiefen.
- Tips, Tricks und Beachtenswertes
Zu guter letzt ein paar Tips, was man beachten sollte und wie man sich selbst seine Arbeit erleichtern
kann:
- CGI Skripten können in verschiedenen Sprachen geschrieben sein. Wenn es möglich ist, sollten
Sie deswegen die Namenskonvention beachten. Perl-Skripten erhalten die Endung .pl, Shell-Skripten die Endung .sh,
C-Sourcen die Endung .c. Ausführbare Programme (Binaries) erhalten keine Endung.
Besonders wenn man mal später nicht mehr genau weiß was ein Skript da macht, ist dies besser
für die Nerven: Es kann schon arg auf den Geist gehen, wenn der Bildschirm erstmal 15 Minuten rumpiepsen
will, nur weil man ausversehen eine binäre Datei erwischt hat.
- Behandeln Sie die Daten, die Sie von den Benutzern entgegennehmen wie rohe Eier! Wer ungeprüft Benutzereingaben
verwendet um damit Systemkommandos, wie exec(), system, open() etc.
auszuführen, darf sich nicht wundern, wenn er seine private Mail eines Tages in alt.sex.harrassment
lesen kann. Die Routine Check_Name() in der cgi-library.pl zeigt, wie man Benutzereingaben sichern
kann.
- Bevor Sie ein CGI-Programm schreiben, schauen Sie im Netz nach, ob nicht schon jemand genau für
dieses Problem eine Lösung kostenlos anzubieten hat. Es ist unsinnig das Rad nochmal zu erfinden.
- Es gibt viele CGI-Authoren, die Ihre Programme im Netz frei anbieten. Das bedeutet aber nicht, daß
diese sich damit nun zu kostenlosen Hilfscentern gemacht haben, denen man jede Frage stellen kann, welche man
mit etwas lesen in einer FAQ selbst lösen könnte.
Wenn man nicht mehr weiterweiß sollte man zuerst die FAQs zu dem Thema lesen, dann in den gewissen
Usenet-Groups und Pinboards fragen, und erst dann sollte man versuchen einen CGI-Author zu kontakten (was
aber sowieso in 90% der Fälle nur eine .procmailrc antworten läßt oder aber lange dauert).
- Murphys Laws gelten auch für die CGI-Programmierung. Also nicht aufregen, nur wundern.
|