traži:  
 php.com.hr > Session managment

Session managment
 


Sessioni su vrlo bitna stvar pri izradi Internet aplikacija. Prvo da malo razjasnim sto su to sessioni, kako funkcioniraju te čemu služe.

U izradi Internet aplikacija postoji velika potreba za nekakvim mehanizmom za pamćenje informacija vezanih uz jedan posjet korisnika našoj aplikaciji (siteu). Taj mehanizam su sessioni. Iz ovoga se može izvući i zaključak što je session. On bi bio jedan posjet siteu jednog korisnika. Session traje sve dok je korisnik na siteu. Kada korisnik prestane otvarati stranice na siteu PHP ima kojim nakon zadanog vremena (vrijeme se zadaje u php.ini-u) briše sve informacije koje su spremljene tokom sessiona na hard disc servera. Ovako se štedi na prostoru.

Da vam malo ilustriram kako funkcioniraju sessionu pokušat ću vam ispričati jednu malu priču.

Korisnik X dolazi na site. PHP mu automatski pridružuje SID (session ID). Pomoću tog id-a se naš korisnik X kasnije identificira kada posjeti neku drugu stranicu na siteu. Kada korisnik dođe na site, skripta automatski stvori session varijablu u koju će se spremati broj posjećenih stranica u ovom sesionu. Ta varijabal se namješta na 0. Sada korisnik odabire svoju omiljenu temu na našem siteu i odlazi na stranicu na kojoj se nalazi više informacija o toj temi. Normalno, mi žalimo dodati u našu session varijablu i ovaj posjet. Skripta to i čini, te mu prikazuje traženi sadržaj. Korisnik čita tekst koji je tražio na prvoj stranici i polako se počinje živcirati jer se ne slaže sa fundamentalnim pitanjima koje je autor teksta koji čita predstavio vrlo neprofesionalno i nepromišljeno. Pred kraj teksta korisnik već počinje nervozno micati miš po ekranu sa krajnjim odredištem na svojim favoritesima i odabire neki site iz njih koji mu neće prouzročiti toliko stresa koliko naš site te odlazi sa našeg sitea.

Sada je ostatak session managmenta na samom PHP-u. Pošto korisnik X koji je identificiran sa svojim SID-om ne radi nove zahtjeve na našem siteu (pošto nam je skinuo sve svece sa neba i pobjegao od neprofesionalnosti našeg autora teksta) PHP zna da se session 'gasi' nakon 30 minuta nakon što je korisnik otišao sa našeg sitea. Sada PHP strpljivo čeka da to vrijeme prođe da može obrisati varijable iz svog temp direktorija koje je skripta stvorila za korisnika X. Ali nekim čudom se korisnik vraća nakon 15 minuta, sada još ljući nego kada je otišao, i traži način kako da nam da do znanja da smo potpuno promašili člankom koji smo objavili na našem siteu. Vraća se na stranicu na kojoj je čitao tekst i primjećuje na dnu stranice formu u koju može unijeti svoj komentar. U trenutku kada se korisnik X vratio na site, sve session informacije (broj posjećenih stranica) i dalje postoje i umjesto da se stvara nova session varijabla sa brojem posjećenih stranica sa nulom za vrijednost, brojanje se nastavlja tamo gdje je stalo kada je korisnik otišao skidajući nam svece sa neba.

Iako je ovo vrlo jednostavna situacija (samo se broje posjećene stranice) ipak znamo da se ne radi o novom korisniku, već o starom korisniku koji nam je pomogao.

Sada dolazimo do pitanja za što koristiti session-e. U gornjoj situaciji smo ga koristili za brojanje posjećenih stranica korisnika X. To je jedan od mogućih namjena. Druga bi recimo bila brojanje ukupnih posjeta našem siteu koji bi bili jednaki broju stvorenih sessiona. U toj situaciji bi pri stvaranju session varijable negdje u bazu ili neki flat file (npr. txt file je flat file) spremili novi broj posjeta siteu.

Još jedna korisna stvar kojas emože 'čuvati' u session varijablama su korisničke informacije poput nicknamea, userID-a i sličnih stvari, zatim sadržaj košarice u e-shop aplikaciji.

Generalno bi se dalo reći da u session varijable spremamo informacije koje tiču korisnika i njegovom posjetu siteu. Te informacije ne moraju, ali mogu biti od velike važnosti za cijelu aplikaciju, ali u 99% situacija one služe samo za olakšan rad tom korisniku (zamislite da korisnik mora negdje na papir zapisivati sve artikle koje želi kupiti na našem siteu).

A sada idemo pogledati aplikaciju iz gornje pričice.

Primjer 32 : Brojanje posjećenih stranica

Primjer koristi višenamjensku strancu!

 

<? ob_start() ;// output buffering

session_start(); // pokreatnje sessiona

// namještanje session varijable

if (session_is_registered("posjeta")){

$posjeta++;

} else {

$posjeta=1;

}

// registriranje session varijable

session_register("posjeta");

?>

<html>

<head>

<title>Session managment</title>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">

</head>

<body>

<?

// višenamjenska stranica

// kontrolna varijabla $k

/* STANJA $k

1 - ispsi elanka koji je jako stresan

2 - stranica za unos i gledanje komentara

default - poeetna stranica sitea

*/

switch (@$k){

case 1:

?>

<h1>Elanak</h1>

<p>Ovo je taj elanak od kojeg se eovjeku diže kosa na glavi</p>

<p>Nažalost morali smo ga cenzurirati zbog velikog broja pritužbi koje su dospjele na naš mail</p>

<form action="<?=$PHP_SELF?>?k=2" method="post" name="forma" id="forma">

<p>Vaše ime:

<input type="text" name="ime">

<br>

Vaš mail

<input type="text" name="textfield">

<br>

Komentar:

<textarea name="komentar" cols="25" rows="10" id="komentar"></textarea>

<br>

<input type="submit" name="Submit" value="Dodaj komentar">

</p>

</form>

<?

break;

case 2:

// obarda forme i prikaz komentara

if (@$_POST["Submit"]){

// fali validacija forme!!!

echo "Vase ime : <b>" . $_POST["ime"] . "</b><br>";

echo "Vaš komentar <pre>\n" . $_POST["komentar"] . "</pre><br>";

?>

<a href="<?=$PHP_SELF?>">Povratak na poeetnu stranicu</a>

<?

} else {

// prikaz svih ostalih komentara

// potrebno je negdje spremiti komentare, npr u bazu

?>

<p>Nažalost nismo još uvijek u moguenosti prikazati sve komenatre</p>

<?

}

break;

default:

?>

<p>DObrodošli na ovaj potono otkvaeen site</p>

<p><a href="<?=$PHP_SELF?>?k=1">Pogledaj elanak od kojeg ae ti se dignuti kosa

na glavi </a>

<?

}

echo "<p>Do sada ste posjetili $posjeta stranica na ovom siteu</p>";

ob_end_flush();

?>

</p>

</body>

</html>


Objašnjenje:

Postoji jedna vrlo bitna stvar kod rada sa sessionima. Sve operacije vezane uz njih se moraju obaviti prije nego što se bilo kakav sadržaj pošalje korisniku. Ovo s emože osigurati na više načina.

Prvi je da se te operacije stave na sam početak skripte. U tom slučaju prije tih operacija ne smije biti nikakav kod, HTML ili prazan red. Ovo je u većini situacija vrlo teško postići. Gotovo nemoguće.

Drugi način za onemogućiti slanje bilo kakvog sadržaja korisniku je korištenjem output buffering funkcija. Output buffering je kontroliranje slanja generiranog HTML koda korisniku. Znači da na samom početku skripte možemo isključiti slanje outputa PHP koda (ili drugim riječia uključiti output buffering). Ovime osiguravamo da se korisniku neće ništa poslati prije nego li mi kažemo da se šalje. Ovom metodom se session operaciej mogu obavljati bilo gdje na stranici.

<? ob_start() ;// output buffering

Ovime je uključen output buffering i korisniku se neće slati nikakv sadržaj prije pojavljivanja

ob_end_flush();

Koji se nalazi pri kraju skripte.

Sada kada smo to riješili možemo se pozabaviti logikom koja je potrebna za brojanje posjećenih stranica. Praktički, ono što želimo napraviti je pri svakom otvaranju skripte uvećati neku varijablu za jedan te zapamtiti vrijednost te varijable za kasnije korištenje kroz session.

Problem koji se otvara je kako znamo da li je trenutno otvaranje skripte (stranice) prvo, ili je korisnik već posjetio neku stranicu na siteu. Iz tog razloga prvo provjeravamo da li postoji varijabla u koju se sprema broj posjećenih stranica te ukoliko postoji njena vrijednost se uvećava, a ukoliko ne postoji stvaramo tu varijablu i namještamo joj početnu vrijednost na 1 pošto je korisnik posjetio jednu (ovu koju gleda) stranicu.

Nakon toga je samo potrebno spremiti namještenu varijablu u session scope (natjerati PHP da ju zapamti)

Evo gornje pričice u PHP dijalektu

 

// namještanje session varijable

if (session_is_registered("posjeta")){

$posjeta++;

} else {

$posjeta=1;

}

// registriranje session varijable

session_register("posjeta");


Provjeru da li postoji varijabla u koju se sprema broj posjećenih stranica vršimo pomoću funkcije

session_is_registered("posjeta")

Funkciji se daje string koji mora biti identičan imenu varijable koju provjeravamo. Funkcija vraća true ukoliko varijabla postoji i false u suprotnom.

Nakon te provjere, ovisno o rezultatu se namješta nova vrijednost te varijable.
Pridruživanje se vrši tako da se varijabli koja ima identično ime kao i provjerena varijabla u if-u red prije.

Nakon namještan je potrebno 'registrirati' novu vrijednost varijable pomoću funkcije

session_register("posjeta");

Ovoj funkciji se također daje string vrijednost koja sadrži identično ime kao i maloprije nesmještena varijabla.

Zašto su ove operacije objavljenje prije switcha koji implementira višenamjensku stranicu?

Zato što je ovo brojenje zajedničko svim stranicama, tj. situacijama. Brojimo ukupan broj otvaranja stranica sitea, a ne samo određene situacije.

Iza switcha u kojem se nalazi sadržaj sitea se ispisuje broj posjećenih stranica.

echo "<p>Do sada ste posjetili $posjeta stranica na ovom siteu</p>";

Zadatak:

1.

Napisati skriptu koja će pitati korisnika da se učlani na naš site (tražiti nick, lozinku i e-mail) zatim te informaciej spremiti u session varijable te u posebnom odjeljku stranice ispivati ukoliko se korisnik još nije registrirao poruku da se registrira sa linkom na formu, a ukoliko se registrirao umjesto linka ispisati njegov nick koji je odabrao. Treba brojati broj posjećenih stranica. Za skriptu napraviti višenamjensku stranicu na kojoj će se nalaziti sav sadržaj. Neka stranica sadrži uz default za početak stranice te formu za registarciju još barem 2 različita slučaja
 



PHP
 © 2004 - 2008 php.com.hr