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 <em>premenné prostredia</em>. 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.

< <
GATEWAY_INTERFACE
SERVER_SOFTWARE Meno a verzia serveru, ktorý odpovedá na požiadavku
SERVER_PROTOCOL Meno a verzia protokolu, pomocou ktorého bola požiadavka doručená
SERVER_PORT Číslo portu na hostiteľskom počítači, na ktorom server beží
REQUEST_METHOD
CONTENT_TYPE Typ žiadaných dát podľa MIME (napr. text/plain)
CONTENT_LENGTH Dĺžka dát odovzdávaných CGI skriptu pomocou štandardného vstupu (v bytoch)
HTTP_FROM E-mail užívateľa, ktorý odoslal požiadavku (väčšina browserov túto premennú nepodporuje)
HTTP_ACCEPT Zoznam MIME typov, ktoré klient akceptuje
HTTP_USER_AGENT Meno a verzia prehliadača, ktorý odoslal požiadavku (zhodné s javascriptovým navigator.userAgent)
HTTP_REFERER URL dokumentu, ktorý klient zobrazoval pred zavolaním CGI skriptu

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.

Developer,
Stiahnuté z Developer.sk