[ 25. February 2000]
- Svato_Straka
JednoduchΘ textovΘ poΦφtadlo - 10. Φas¥ CGI
UrΦite ste si u₧ na mnoh²ch strßnkach vÜimli poΦφtadlß prφstupov. M⌠₧u by¥ r⌠zne - od vyΦaΦkan²ch nevkusn²ch obrovsk²ch pestrofarebn²ch ohßv a₧ po strohΘ obyΦajnΘ textovΘ.
A prßve na tie druhΘ - podstatne vkusnejÜie - sa pozrieme a ukß₧eme si, ako v Perli takΘto jednoduchΘ poΦφtadlo vytvori¥.
Tak₧e ozrejmime si, ako bude naÜe poΦφtadlo fungova¥. Potrebujeme, aby sa hodnota poΦφtadla zv²Üila v₧dy pri prφstupe k strßnke. Tak₧e najjednoduchÜie sa tu javφ pou₧itie SSI direktφvy, ktorß v₧dy spustφ skript, ktor² zistφ aktußlny stav poΦφtadla a zv²Üi ho o 1. druhou mo₧nos¥ou je vola¥ priamo CGI skript, ktor² naΦφta strßnku a vlo₧φ do nej hodnotu poΦφtadla. Ukß₧eme si obe mo₧nosti, pri Φom poΦet prφstupov budeme zaznamenßva¥ v textovom s·bore.
PoΦφtadlo - SSI verzia
Pre naÜu ukß₧ku si vytvorφme jednoduch· strßnku, do ktorej pomocou SSI direktφvy vlo₧φme volanie na skript count1.cgi . Tßto strßnka m⌠₧e vyzera¥ nasledovne:
<HTML>
<HEAD>
<TITLE>Jednoduche pocitadlo</TITLE>
</HEAD>
<BODY>
PoΦet prφstupov k strßnke: <!--</BODY>
</HTML>
Budeme u₧ potrebova¥ len dva s·bory. Jeden s aktußlnym stavom poΦφtadla. Nazveme si ho stav1.txt . Druh²m bude samotn² skript, ktor² pri svojom zavolanφ otvorφ s·bor stav1.txt, preΦφta z neho stav poΦφtadla, zv²Üi ho o 1 a zapφÜe naspΣ¥. Tak²to skript m⌠₧e vyzera¥ nasledovne:
$subor = $ENV{DOCUMENT_ROOT} . "/stav1.txt";
open(STAV, $subor);
$stav = <STAV>;
close(STAV);
$stav++;
open(ZAPIS, ">".$subor);
print ZAPIS $stav;
close(ZAPIS);
print "Content-type: text/htmlnn";
print $stav;
Tu je vysvetlenie ku skriptu. Ulo₧φme si cestu k s·boru i s jeho nßzvom do premennej $subor . Tento s·bor pomocou prφkazu open otvorφme, pri Φom dostane symbolickΘ meno STAV . Toto symbolickΘ meno sa v Perli naz²va ovlßdaΦ s·boru (z anglickΘho file handle). S jeho pomocou m⌠₧ete pracova¥ so s·borom bez toho, aby ste vedeli kde je na disku v skutoΦnosti umiestnen² at∩. Pok²m nezadßte pri otvßranφ s·boru sp⌠sob, ak²m sa mß k s·boru pristupova¥, bude dan² s·bor otvoren² len pre Φφtanie.
V ∩alÜom kroku naΦφtame obsah s·boru so premennej $stav . K tomu, aby bola tßto operßcia ·speÜnß, musφ sa danß hodnota nachßdza¥ na prvom riadku v nami tvorenom s·bore. Perl toti₧ rozoznßva kontext, v akom sa k dßtam pristupuje. Pok²m k ovlßdaΦu s·boru pristupujete v skalßrnom kontexte, preΦφta vßm z otvorenΘho s·boru aktußlny riadok. Pok²m explicitne neurΦφte Φφslo riadku, preΦφta sa prv² riadok (vi∩ nßÜ prφklad). Pok²m vÜak budete s ovlßdaΦom s·boru pracova¥ v zoznamovom kontexte (@subor = <SUBOR> ), naΦφta sa do po╛a obsah celΘho s·boru.
V ∩alÜom kroku s·bor pomocou prφkazu close uzavrieme. Toto je krok, na ktor² by sa nemalo zab·da¥, vÜetci vieme Φo robφ mno₧stvo naotvßran²ch s·borov so systΘmom.
Nasleduje zv²Üenie stavu poΦφtadla: $stav++; . Operßtor ++ je operßtorom inkrementu - sp⌠sobφ zv²Üenie hodnoty premennej o 1.
V ∩alÜom ·seku opΣ¥ otvorφme s·bor so stavom poΦφtadla - tentokrßt pre zßpis, Φo je urΦenΘ pri nßzve s·boru: ">".$subor . Operßtor > presmeruje v²stup vÜetk²ch prφkazov, ktorΘ svoj v²stup posielaj· na dan² ovlßdaΦ s·boru, do nami otvorenΘho s·boru. ╧alÜφ riadok, print ZAPIS $stav; , posiela v²stup prφkazu print - hodnotu premennej $stav - na ovlßdaΦ ZAPIS, ktor² je presmerovan² do s·boru, ktorΘho nßzov s kompletnou cestou je ulo₧en² v premennej $subor .
Po uzavretφ s·boru u₧ nasleduje len v²pis ΦiastoΦnej http hlaviΦky a aktußlneho stavu poΦφtadla.
Prφklad v praxi
PoΦφtadlo ako priamo volan² CGI skript
Pok²m nem⌠₧ete na svojich strßnkach pou₧i¥ SSI, budete musie¥ zvoli¥ trochu in² prφstup - a to zavola¥ CGI skript ktor² zobrazφ po₧adovan· strßnku a na potrebnΘ miesto vlo₧φ aktußlny stav poΦφtadla. RieÜenie je mo₧no jednoduchÜie ako by sa mohlo zda¥. Tvorφ ho mierne upraven² horeuveden² skript a modifikovanß strßnka, v ktorej bude vaÜe poΦφtadlo.
Strßnku s poΦφtadlom je potrebnΘ upravi¥ tak²m sp⌠sobom, ₧e na miesto, kde mß vaÜa okrasa figurova¥, uvediete nejak² re¥azec, ktor² bude skriptom nahraden² za aktußlnu hodnotu poΦφtadla. Z toho vypl²va, ₧e by to mal by¥ re¥azec, ktor² sa inak v strßnke nevyskytuje - jedine ₧e by ste chceli pou₧i¥ poΦφtadlo viackrßt.
Povedzme teda, ₧e naÜa strßnka bude obsahova¥ na mieste poΦφtadla re¥azec CNTR (pozor na ve╛kos¥ pφsmen!):
<HTML>
... strßnka...
<P>
PoΦet prφstupov k strßnke: CNTR
<P>
... dokonΦenie strßnky...
</HTML>
Ulo₧φme si t·to strßnku povedzme pod menom counter.html . Stav poΦφtadla budeme uklada¥ v s·bore s nßzvom stav2.txt . Tu je teda upraven² skript:
$stranka = $ENV{DOCUMENT_ROOT} . "/counter.html";
$pocitadlo = $ENV{DOCUMENT_ROOT} . "/stav2.txt";
open(STAV, $pocitadlo);
$stav = <STAV>;
close(STAV);
$stav++;
open(ZAPIS, ">".$pocitadlo);
print ZAPIS $stav;
close(ZAPIS);
print "Content-type: text/htmlnn";
open(STRANKA, $stranka);
while(<STRANKA>) {
if(/CNTR/) {
s/CNTR/$stav/;
}
print;
}
close(STRANKA);
Ako tento skript funguje by ste u₧ mali vedie¥. V ka₧dom prφpade si ho m⌠₧ete pozie¥ v praxi.
VÜetky vaÜe komentßre, pripomienky a nßvrhy oΦakßvam na mojom maili: straka@developer.sk.
|
|
|