hallo,
#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $key (keys %ENV) {
print "$key --> $ENV{$key}<br>";
}
Theoretisch nach deiner Auffassung müßte auf der Konsole des Rechners(stdout), wo der Apache läuft die Umgebungsvariablen des Perlscriptes ausgegeben werden.
Richtig?
Falsch. %ENV listet die CGI-Umgebungsvariablen auf, gibt also Informationen über die CGI-Schnittstelle. Du kannst dieses kleine Script auch von der Kommandozeile aus aufrufen, es liefert dieselben Aussagen - völlig ohne Apache. Und es handelt sich _nicht_ um "Umgebungsvariablen des Perlscriptes". Allerdings gibt es Perl-Module (CGI.pm beispielsweise), die eigene Umgebungsdaten definieren, wobei das oftmals den CGI-Umgebungsvariablen recht ähnlich sieht.
Wieso dann falsch?
Ich bezog mich auf den Output des Perlscriptes wie du nachlesen kannst. Diese werden im Script mit print auf STDOUT ausgegeben. Das dieses Script auch von der Komandozeile aufrufbar ist spielt keine Rolle. Und Environment sollte jedes Progi haben, aber nicht immer mit gleichem Inhalt, Jenachdem wie es aufgerufen wird und was der Parentprozess liefert.
In unserem Fall werden die CGI-typischen Environmentvariablen von Apache ins Environment geschrieben und je nach Methode (GET oder POST der Anforderung) wird eben auch STDIN benutzt, Steht übrigens in der Apache-Doku kannste nach lesen.
In sofern ist deine Aussage falsch, das dieser Script die gleiche Ausgabe erzeugen würde.
Eine CGI-Umgebung zeichnet sich dadurch aus, das eine Reihe Server-Informationen dort abgelegt sind, HTTP-Refferer etc. Und die Shell gibt wieder ein anderes Environment mit
Deshalb werden die Ausgaben sehr unterschiedlich sein.
Beweis:
1. Über cgi werden diese ausgegeben:
SCRIPT_NAME SERVER_NAME SERVER_ADMIN HTTP_ACCEPT_ENCODING HTTP_CONNECTION REQUEST_METHOD HTTP_ACCEPT SCRIPT_FILENAME SERVER_SOFTWARE HTTP_ACCEPT_CHARSET QUERY_STRING REMOTE_PORT HTTP_USER_AGENT SERVER_SIGNATURE SERVER_PORT HTTP_ACCEPT_LANGUAGE REMOTE_ADDR HTTP_KEEP_ALIVE
SERVER_PROTOCOL PATH REQUEST_URI GATEWAY_INTERFACE SERVER_ADDR DOCUMENT_ROOT HTTP_HOST
2. Über die Shell werden diese ausgegeben:
HOME LANGUAGE KONSOLE_DCOP_SESSION SSH_AGENT_PID DISPLAY GTK_RC_FILES XDM_MANAGED SSH_AUTH_SOCK PWD GTK2_RC_FILES LANG USER XCURSOR_THEME LOGNAME GS_LIB SHLVL OLDPWD _ DESKTOP_SESSION PATH KONSOLE_DCOP WINDOWID COLORTERM SHELL XPSERVERLIST KDE_FULL_SESSION TERM DM_CONTROL SESSION_MANAGER PAGER KDE_MULTIHEAD
Siehst du irgendwelche Gleichheit, wenn ja definiere gleich!
Deine Aussage 'Und es handelt sich _nicht_ um "Umgebungsvariablen des Perlscriptes".' ist definitiv falsch!
Zitat Camelbook S.683:
%ENV
Dieser Hash enthält Ihre aktuellen Umgebungsvariablen. Wird ein Wert in %ENV gesetzt, ändert sich die Umgebung für Ihren Prozess und die nachfolgenden gestarteten Child-Prozesse.(Die Umgebung des Parent-Prozess kann bei keinem UNIX-System geändert werden.)
Für mich ist perl und perlscript in der Laufzeit übrigens identisch, Falls du wiedermal spitzfindig meine Formulierung auseinandernehmen willst, und das aus gutem Grund, denn perl ist kein reiner Interpreter. Als Mensch bin ich in der Lage Aussagen zu verdichten!
Und deine Art und Weise ganze Aussagen als Falsch zu bezeichen, nur weil statt das Script der Script geschrieben wurde stinkt zum Himmel. (Tschuldigung)
Tatsache aber ist, das die Ausgabe letzten Endes im Browserfenster des Client-Rechners dargestellt wird. Das kann eigentlich nur passieren, wenn das Programm, das den Interpreter aufruft den Standard output "abfängt" und an den Client-Rechner überträgt wie auch immer.
Nicht ganz richtig. Das kann es, weil der Interpreter natürlich so brav ist, ihm zusätzlich diese angeforderten Daten nochmals zur Verfügung zu stellen, so daß er sie an den anfragenden Client weiterreichen kann.
Und wie soll das geschehen? Vor allem, wenn in der Apache-Doku ebenfalls STDOUT erwähnt wird?
Wozu sollte perl eine Information zweimal liefern?
Gibt das Scriptum ohne einen HTTP-Header etwas mit print auf STDOUT aus, landet es im error-log des Apache. Am Header erkennt Apache, was er also machen soll.
Es wäre unsinniger Overhead müßte der perl-interpreter ermitteln, wie das Script aufgerufen wurde und nach deiner Aussage entsprechend zweimal eine Information liefern würde, einmal an STDOUT und einmal an Apache.
Viel einfacher wäre es, wenn Apache den STDOUT vor dem Aufruf des Interpreters verbiegt. und
nach dem beenden dann diese Daten auswertet. Perlweis das aber nicht, sondern gibt stur auf STDOUT aus. Eine Verdopplung der Daten, wie du das siehst, ist Unfug, es sei denn, es gäbe gute Gründe dafür. Dann leg mal los! (Interprozess-Kommunikation? wo?)
Und dieses übergeben hat nichts mit STDIN oder Query_string im Environment zu tun?
Wieso nun STDIN (und nicht mehr STDOUT)? Und was würde geschehen, wenn %QUERY_STRING leer ist?
(Das kannst du deiner eigenen Aussage entnehmen:
"...und dem dann das Script zur gefälligen Abarbeitung übergeben."
Ich bezog mich auf das letzte Wort in deinem Satz.)
Definiere leere Environmentvariable! ;-)
Entweder ist eine Env-Var da oder nicht da, wenn sie da ist, hat sie Inhalt.
Übrigens gipt es keinen solchen %QUERY_STRING Hash in perl. :-)
Aber du meinst bestimmt $ENV{'QUERY_STRING'} oder?
For example, if the URL http://www.example.com/cgi-bin/test.pl is requested, Apache will attempt to execute the file /usr/local/apache2/cgi-bin/test.pl and return the output.
Ich kann zwar nicht gut Englisch, aber steht da nicht "Apache....and return the Output"?
Wichtiger ist "will attempt to execute". Apache wird feststellen, daß er das gar nicht kann, aber glücklicherweise gibt es ja noch die shebang, in der steht, wer es kann. Also wird Apache seine Bemühungen aufgeben und das Script dankbar an den Perl-Interpreter übergeben.
Also in meiner Aussage ist erstmal wichtig, das damit von Seiten der Doku bestätigt wird, das Apache den Output "returniert" an den Client. Das hast du ja zuerst nicht eingeräumt.
Es ist auch nicht so wichtig, das Apache das, was er nicht selbst kann, an andere weiter gibt
Davon ging ich bis her immer aus, insofern ist das trivial.
"Wir sind Borg. Widerstand ist zwecklos".
:-))))
He, du regst mich uff, aber macht nix!
Bin Mensch, und was ich nicht integrieren kann wird gefressen ;-)
Joe