[ 19. October 1999]
- Svato_Straka
PremennΘ prostredia - 1. Φas¥ CGI
Ako som u₧ spomφnal v ·vode, pri odovzdßvanφ dßt CGI skriptu dopσ≥a webov² server k odosielan²m dßtam premennΘ prostredia. Tieto premennΘ je najjednoduchÜie prirovna¥ k systΘmov²m premenn²m vßÜho OS (asi najznßmejÜou z nich je premennß PATH, ostatnΘ m⌠₧u by¥ ÜpecifickΘ pre jednotlivΘ OS).
K premenn²m prostredia m⌠₧ete samozrejme vo svojich programoch vo╛ne pristupova¥ a pou₧φva¥ ich. KonkrΘtne v Perli s· tieto premennΘ ulo₧enΘ v asociatφvnom poli %ENV (vysvetlφm ni₧Üie). V nasleduj·cej tabu╛ke nßjdete zoznam vÜetk²ch premenn²ch prostredia.
Pozastavil by som sa pri premenn²ch PATH_INFO a PATH_TRANSLATED . PamΣtßte sa na Φas¥ serißlu o WebDesigne, kde sme si hovorili o obrazov²ch mapßch? KonkrΘtne o mapßch na strane servra. Volanie cie╛a po kliknutφ na urΦit· Φas¥ mapy tam vyzerß nasledovne: /cgi-bin/imagemap/data/user.map
Server m⌠₧e CGI skripty identifikova¥ dvoma sp⌠sobmi: alebo je v konfigurßcii servra urΦenΘ, ₧e CGI skripty maj· urΦit· prφponu, alebo, a to b²va ΦastejÜφ prφpad (kv⌠li bezpeΦnosti), je v konfigurßcii definovan² adresßr, v ktorom sa nachßdzj· vÜetky CGI skripty. Z toho vychßdza server pri dek≤dovanφ takΘho volania: CGI adresßr je definovan² ako /cgi-bin/ , nßzov skriptu je teda imagemap a vÜetko, Φo nasleduje za menom skriptu je obsahom premennej PATH_INFO (v tomto prφpade teda /data/user.map). Skript, aby mohol k s·boru urΦenΘho v PATH_INFO prist·pi¥, potrebuje pozna¥ absol·tnu cestu k nemu v rßmci lokßlneho systΘmu. Tßto cesta je ulo₧enß v premennej PATH_TRANSLATED , ktorß vznikne spojenφm premenn²ch DOCUMENT_ROOT a PATH_INFO.
Uve∩me si teraz ako prφklad jednoduch² skript, ktor² ako svoj v²stup vypφÜe zoznam premenn²ch prostredia a ich hodn⌠t.
print "Content-type: text/plain", "nn";
foreach $key (keys %ENV) {
print $key, " = ", $ENV{$key}, "n";
}
exit(0);
V²sledok skriptu
A tu je vysvetlenie tohoto skriptu. V prvom riadku,
╧alej nasleduje riadok print "Content-type: text/plain", "nn"; , v ≥om sa tvorφ Φas¥ HTTP hlaviΦky, konkrΘtne definuje MIME typ dßt, ktorΘ s· v²stupom skriptu. V naÜom prφpade bude v²stupom Φist² text, Φo je danΘ typom text/plain . Za t²mto riadkom nasleduje prßzdny riadok, ktor² odde╛uje HTTP hlaviΦku od samotn²ch dßt.
V CGI skripte musφte vytvori¥ v₧dy aspo≥ Φas¥ HTTP hlaviΦky, minimßlne to musφ by¥ prßve urΦenie typu v²stupn²ch dßt. Samozrejme ₧e m⌠₧ete prida¥ ∩alÜie riadky, o tom vÜak viac nabud·ce.
Nasleduj·ce tri riadky zaΦφnaj·ce prφkazom foreach a konΦiace znakom } si vysvetlφme na nasledovnom prφklade.
Perlovsk² prφkaz foreach definuje vo svojom tele blok prφkazov, ktorΘ sa maj· vykona¥ pre urΦit· premenn· nadob·daj·cu hodnoty danΘho po╛a. ètandardnß syntax prφkazu je
foreach $premenna (@pole) {
}
Perl rozoznßva 5 zßkladn²ch typov premenn²ch: skalßr (napr. $foo), pole (napr. @foo), hash (asociatφvne pole, napr. %foo), ovlßdaΦ (handle, napr. FOO) a typeglob (napr. *foo). PoslednΘ 2 typy si nechßme na nesk⌠r, tie prvΘ 3 si vysvetlφme teraz.
Typick²m prφkladom skalßru je re¥azec. Tento typ premennej je aj najjednoduchÜie pochopite╛n². Ako prφklad si m⌠₧eme uvies¥ nasledovn· konÜtrukciu: $nazov = "Developer Zone"; . Obsahom skalßra m⌠₧e by¥ Φφslo, znak alebo re¥azec.
Polia s· tie₧ jednoducho pochopite╛nΘ. Definφcia po╛a m⌠₧e vyzera¥ nasledovne: @temy = ("HTML", "JavaScript", "CGI", "PHP"); . Toto je jednoduchΘ ÜtvorprvkovΘ pole. Inou mo₧nos¥ou, ako definova¥ toto pole je definova¥ jeho jednotlivΘ prvky: $temy[0] = "HTML"; $temy[1] = "JavaScript"; at∩. JednotlivΘ prvky po╛a s· indexovanΘ od nuly, to jest prv² prvok bude v₧dy $foo[0].
Posledn²m spomφnan²m typom bude hash, asociatφvne pole. Toto pole je najjednoduchÜie predstavi¥ si ako pole dvojφc kl·Φ-hodnota. Vyzerß to nasledovne:
%foo {
$kluc1 => $hodnota1,
$kluc2 => $hodnota2,
$kluc3 => $hodnota3
}
Ak chcete potom niektor· hodnotu pou₧i¥, namiesto $hodnota volßte $foo{$kluc} . Toto mß v²znam napr. u spomφnan²ch premenn²ch, ktorΘ s· vÜetky ulo₧enΘ v poli %ENV a ich hodnoty m⌠₧ete zφska¥ volanφm $ENV{nazov_premennej} .
V naÜom prφpade sa teda do premennej $key ukladaj· postupne jednotlivΘ nßzvy premenn²ch a po jednej s· vytlaΦenΘ ich hodnoty.
V poslednom riadku prφkladu, exit(0); sa ukonΦφ program s nßvratovou hodnotou 0.
Nabud·ce si povieme nieΦo o v²stupoch CGI skriptov.
|
|
|