Mintapélda
Helyezzünk el a weboldalunkon egy számlálót, mely mutatja, hányan látogatták meg a mai napon
eddig az oldalunkat!
A legegyszerűbb megoldás alapgondolatát az jelentheti, ha
- az eddigi látogatók számát egy közönséges text fájlban tároljuk,
- minden új látogató esetén ezt a számot eggyel növeljük,
- az aktuális számértéket pedig a weblapon megjelenítjük.
Ennek megvalósításához fájlkezelés szükséges, aminek legfőbb műveletei
Szükségünk lesz még két kiegészítő függvényre a következő lehetőségekkel:
Ezekkel már könnyen teljesíthető a feladat:
<?
$fajlnev = date("y-m-d") . ".txt" ; // (1)
if( file_exists($fajlnev) ) // (2)
{
$f = fopen( $fajlnev , "r" ) ;
$n = fread( $f , filesize($fajlnev) ) ;
fclose( $f ) ;
}
else // (3)
{
$n = 0 ;
}
$n++ ; // (4)
$f = fopen( $fajlnev , "w" ) ; // (5)
fwrite( $f , $n ) ;
fclose( $f ) ;
print "Oldalletöltések száma: $n" ; // (6)
?>
A programban számmal jelzett részekkel az alábbi feladatokat végezzük el:
- (1)A számláló értékét tartalmazó fájl nevét a mai dátumból képezzük, kiterjesztése txt. Ezzel az elnevezéssel egyben azt is megoldjuk, hogy minden naphoz önálló fájl tartozzon, vagyis csakugyan napi számlálást fogunk végezni.
- (2)Ha már létezik ez a fájl, akkor olvasásra megnyitjuk, és $n változóba kiolvassuk belőle a tartalmát, majd bezárjuk a fájlt.
- (3)Ha a fájl még nem létezik, akkor is létrehozzuk $n változót, és értékét nullára állítjuk.
- (4)Eggyel megnöveljük $n változó értékét.
- (5)Létrehozzuk a számláló értékét tartalmazó fájlt (ha már létezett, akkor most felülírjuk), és $n értékét belementjük. A fájlt bezárjuk.
- (6)Képernyőn is megjelenítjük $n új értékét, vagyis a mai eddigi látogatók számát.
Oldalletöltések száma: 207
Egy nem várt probléma

Azonban van egy komoly probléma ezzel a megvalósítással: a számláló jelenleg
nem a látogatókat,
hanem az oldalletöltéseket számolja. Ugyanis az oldal minden frissítése után eggyel
tovább növekszik a számláló, nem pedig csak az új látogatók esetén.

Kérdés tehát:
hogyan különböztessük meg az egyes látogatókat? IP címük alapján? Időkorlát
alapján? Ezek nem tökéletes megoldások, hiszen pl. egy iskolai teremben jó eséllyel minden gép
ugyanazon az IP-címen van (mert csak a belső hálózaton különböznek egymástól), pedig különböző
felhasználók ülnek a gépek előtt. Illetve attól, hogy egy adott látogató pl. majd csak egy óra
múlva frissíti az oldalt, attól még ő ugyanaz a látogató marad. De akkor mi jelentheti a
megoldást?

Általában egyazon felhasználó tevékenysége alatt azt a folyamatot értjük, ami a böngészője
megnyitásával kezdődik, és annak bezárásával végződik. Az e két esemény között eltelt időt
munkamenetnek, vagy szakmaibb kifejezéssel élve
session-nek hívjuk. Ha meg
tudnánk valósítani, hogy munkamenetenként csak egyszer számoljon a számláló, akkor készen
is lennénk a megoldással.
A munkamenet, vagyis a session használata
A fentiekben megfogalmazott cél eléréséhez a
PHP session-kezelő lehetőségeit
kell segítségül hívni. Ezen belül első lépésként szükségszerű egy munkamenetet indítanunk
a kiszolgáló webszerveren, hogy mint felhasználók, ott is azonosíthatóak legyünk. Ehhez a
session_start()
függvényt kell felhasználnunk, melynek eredményeként csakugyan kapunk a szervertől egy
úgynevezett session-azonosítót, ami csak a miénk, és csak az adott munkamenetre vonatkozik.
Bár a saját session-azonsítónkat lekérdezhetjük a
session_id
függvénnyel - jelenleg ez így néz ki:
qtohfpma9vlrsd9d9adf0rkg42
hossza 22-40 karakter közötti, véletlenszerű betűkből és számokból áll -, ennek azonban
számunkra nagy gyakorlati jelentősége nincsen, hiszen ez csupán a szerveren fontos adat
a mi ottani azonosíthatóságunk céljából.
$_SESSION
Ám onnantól kezdve, hogy indítottunk egy munkamenetet, már használhatjuk a
$_SESSION
változót, és
ez lesz számunkra az igazán fontos. Ez a változó egy olyan speciális,
tömb típusú változó, melyben általunk megadott adatokat tudunk eltárolni úgy, hogy ezen
adatok nemcsak az aktuálisan futó PHP programunk ideje alatt maradnak elérhetőek, hanem
egészen addig, amíg a munkamenetünk létezik. Ebben az a legnagyszerűbb, hogy adatokat
tudunk továbbvinni egyik oldalról a másikra.
Mire lehet jó a $_SESSION ?
Két nagyon tipikus felhasználását érdemes megemlíteni:
1.
Regisztrációt követő bejelentkezést megvalósító oldalak esetén a
$_SESSION változóban tároljuk el a beléptetett felhasználó valamilyen
azonosítóját azért, hogy minden további oldalon megmaradjon a belépés
ténye, vagyis ne kelljen minden új oldal megnyitásakor újra és újra
bejelentkezni.
2.
Webáruházak esetén a $_SESSION változó szolgál a vásárlói kosár
adatainak eltárolására is. Ezáltal válik lehetővé, hogy a webshop
különböző oldalai között ugrálva-böngészve folyamatosan gyűjtögethessük
a megvásárolni kívánt termékeket a kosárban.
Tehát mitől lesz látogatottság-számláló?
Ennyi ismeret birtokában már sejthető, hogy a látogatóinkat is a $_SESSION tömb segítségével
fogjuk nyomon követni, vagyis ennek segítségével fogjuk megoldani, hogy minden látogató
csak egyszer (az áltata megnézett legelső oldal megtekintése alkalmával) növelje a számláló
értékét a böngészése során. De hogyan?
- A program elején elindítjuk a munkamenetet - vagy visszanyerjük belőle
az adatokat. (7)
- Amikor a felhasználó először letölt egy oldalt, akkor elhelyezünk
egy tetszőleges bejegyzést a $_SESSION változóban. (9)
- Mielőtt az oldalletöltéssel egyidejűleg növelnénk a korábbi mintapéldánkban
létrehozott számláló értékét, megvizsgáljuk, hogy tartalmazza-e már a $_SESSION az általunk
benne elhelyezni kívánt tetszőleges bejegyzést. (8)
- Ha nem tartalmazza, akkor az nyilván azért van, mert épp az imént nézi
meg emberünk legelőször az oldalt - tehát növeljük a számláló értékét. (4)-(5)
- Ha már tartalmazza, akkor az azért van, mert korábban már megnézte
emberünk az oldalt - tehát nem növeljük a számláló értékét, vagyis nincs dolgunk.
Mindezeket beépítve a korábban megírt programunk, az alábbi kódot kapjuk (benne színessel
kiemelve az újdonságokat):
<?
session_start(); // (7)
$fajlnev = date("y-m-d") . ".txt" ; // (1)
if( file_exists($fajlnev) ) // (2)
{
$f = fopen( $fajlnev , "r" ) ;
$n = fread( $f , filesize($fajlnev) ) ;
fclose( $f ) ;
}
else // (3)
{
$n = 0 ;
}
if( $_SESSION['valami'] != 1 ) // (8)
{
$n++ ; // (4)
$f = fopen( $fajlnev , "w" ) ; // (5)
fwrite( $f , $n ) ;
fclose( $f ) ;
$_SESSION['valami'] = 1 ; // (9)
}
print "Oldalletöltések száma: $n" ;
print "Mai látogatók száma: $n" ; // (6)
?>
Az ekképpen megvalósított programunk által működtetett számláló értéke már nem fog növekedni
az oldal frissítésének hatására:
Mai látogatók száma: 192
Persze, ha közben bárhol máshol, más felhasználó is elkezdi nézni az oldalt, akkor azt már
a számláló 1 új látogatóként érzékeli, és számolja.
Kiegészítő gondolatok
A megvalósított számláló kapcsán terítékre került elméleti megfontolásokat érdemes
még néhány gondolattal kiegészíteni.
- A session_start() függvény hívását mindig a program elején
kell megtennünk - precízen fogalmazva akkor, amikor még semmilyen kiírást
nem követtünk el a weblapon.
- Bár fentebb úgy fogalmaztunk, hogy a munkamenet a böngésző bezárásával
ér véget - ez csak részben igaz. A munkamenet akkor is véget érhet, ha
"túl sokáig" nem kommunikálunk a szerverrel, vagyis pl. nem ülünk a gép
előtt. Ekkor ugyanis lejárhat a session-idő, ami azt jelenti, hogy
elveszítjük a $_SESSION változóban eltárolt értékeinket. A szerveren
beállított session-idő (másodpercben értelmezett) értékét a
phpinfo() függvénnyel tudjuk lekérdezni,
és a kapott képernyő session.gc_maxlifetime sorából kiolvasni.
- Ha privát böngészőt nyitunk, akkor az másik böngészőnek, és így
másik munkamenetnek számít. Ennek megfelelően ott mi magunk is új
látogatók leszünk ugyanazon az oldalon.
- Számlálónk a keresőrobotok látogatásait is látogatásként értelmezi,
vagyis ezek is növelik a mutatott értéket. Ennek kiküszöbölése ugyan
nem lehetetlen, de mindenképpen összetettebb látogatói adatelemzést
igényel.
Feladatok
1.
Tegye elegánsabbá a számláló kinézetét azzal, hogy nem szöveges kiírással jeleníti meg az
aktuális értéket, hanem valamilyen grafikus formában, például az alábbiak szerint:
Ehhez jó alapanyagot találhat a
oldalon, melyek közül a fenti képen az
Odometer Black számtípus látható.
2.
Készítsen statisztikát, mely az elmúlt hét látogatottságát mutatja be valamilyen grafikus
formában. Ötletadónak a következő ábrát is használhatja:
Napi látogatottsági adatok
  |
  |
  |
  |
  |
  |
  |
  |
06.19 |
06.20 |
06.21 |
06.22 |
06.23 |
06.24 |
06.25 |
06.26 |
oldalletöltések száma
látogatók száma
Természetesen ahhoz, hogy a fenti diagram mintájára az oldalletöltések számát is,
és a látogatók számát is ábrázolni lehessen, meg kell oldani, hogy mind a két adat
eltárolásra kerüljön. Amennyiben még nincs elegendő elmentett statisztikai adat az
Ön saját oldalához, úgy manuálisan létrehozott teszt-fájlokkal érdemes átmenetileg
helyettesíteni azokat.