Látogató számláló, online felhasználók funkcióval

Egy kicsivel összetettebb adatbázis alapú (példában mysql) látogató számlálót fogunk most megnézni. Ami talán kicsit érdekessé vagy különlegessé teszi, hogy a session-ök száma alapján fogjuk majd meghatározni az online látogatók számát, ami pontosabb adatod ad, mint az általába adatbázisból kiolvasott (interval ‘x’ minute) értékek.

Akkor vágjunk is bele:

Felépítés:

/conf/
/conf/mysql_connect.php
/includes/
/includes/session_start.php
/includes/statistic.php
/index.php

1.) Adatbázis létrehozása

Először is kezdjük az adatbázissal:

CREATE TABLE 'ips' (
'id' INT(11) NOT NULL AUTO_INCREMENT,
'ip' VARCHAR(16),
'expire' VARCHAR(16),
'date' DATETIME,
PRIMARY KEY  ('id')
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
CREATE TABLE 'ips_counter' (
'id' INT(11) NOT NULL AUTO_INCREMENT,
'counter' INT(11),
PRIMARY KEY  ('id')
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
INSERT INTO 'ips_counter' ('id', 'counter') VALUES (1, 0);

Létrehozunk két táblát az adatbázisunkban ips, és ips_counter néven. Az mezők sorban a következők: (ips tábla) id – azonosító, ip – a látogató ip címe, expire – lejárat dátuma (nap.hónap.év), date – beszúrás dátuma, (ips_counter tábla) id – azonosító, counter – látogatók száma.

2.) mysql_connect.php létrehozása

Második lépésben hozzuk létre a conf mappába a mysql_connect.php fájlt a következő tartalommal:

<?php
# host név
$db_host = "localhost";
# felhaszánlónév
$db_user = "user";
# jelszó
$db_password = "password";
# az adatbázisunk
$db_name = "database";
 
# adatbázisunk táblái
$db_ips = "ips";
$db_ips_counter = "ips_counter";
 
# kapcsolódás az adatbázishoz
$kapcsolodas = mysql_connect($db_host, $db_user, $db_password) or die ("Nem sikerült kapcsolódni az adatbázishoz: ".mysql_error());
mysql_select_db( $db_name, $kapcsolodas ) or die ("Hiba az adatbázis kiválasztásakor: ".mysql_error());
 
?>

A host, felhasználónév, jelszó, adatbázis értékeit természetesen módosítani kell a megfelelő értékekre. Változókban tároljuk a tábláinkat is így, ha más néven hoztad létre a táblákat akkor csak itt kell módosítanod őket ($db_ips = “táblád neve”). Ezután pedig kapcsolódunk a mysql-hez és kiválasztjuk a táblánkat.

3.) session_start.php

Harmadik lépésként a includes mappánkban hozzuk létre a session_start.php fájlunkat a következő tartalommal:

<?php
# elindítunk egy munkamenetet, amely majd később az online tagok megszámlálásához kell
function session() {
 
session_start();
session_register("online");
 
$online = 1;
 
}
 
?>

A session nevű funkcióban elindítjuk a munkamenetünket és regisztrálunk bele egy értéket ($online = 1), így létrehozunk egy munkamenet azonosítót, melyek későbbi megszámlálásával tudjuk majd mennyi online látogatónk van. Ez azért jó mert, ha a látogató elhagyja az oldalt akkor a session törlődik és így az oldal elhagyásával, vagy az oldalra való belépéssel pontosan számolhatjuk mennyi online felhasználónk van.

4.) statistic.php létrehozása

Negyedik lépésünk kicsit terjedelmesebb lesz, de először is az includes mappában hozzuk létre a statistic.php fájlunkat a következő tartalommal:

<?php
 
function statistic() {
 
# ellenőrizzük az ip-t
if (isset($_SERVER)) {
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
$realip = $_SERVER["HTTP_CLIENT_IP"];
}
else {
$realip = $_SERVER["REMOTE_ADDR"];
}
 
}
else {
if ( getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
$realip = getenv( 'HTTP_X_FORWARDED_FOR' );
}
elseif ( getenv( 'HTTP_CLIENT_IP' ) ) {
$realip = getenv( 'HTTP_CLIENT_IP' );
}
else {
$realip = getenv( 'REMOTE_ADDR' );
}
}
 
# kapcsolódunk az adatbázishoz
include "./conf/mysql_connect.php";
 
# definiáljuk a mai dátumot nap, hónap, év formában
$now = date("d.m.Y");
 
# megnézzük, hogy van e már ilyen ip az adatbázisunkban
$ips = mysql_query( "SELECT ip, expire FROM ".$db_ips." WHERE ip = '$realip' LIMIT 1");
$rows = mysql_num_rows( $ips );
 
# ha van ilyen ip kiolvassuk, hogy mikor jár le
if ( $rows != 0 ) {
while ( $rows = mysql_fetch_array( $ips ) ) {
$expire = $rows["expire"];
}
 
# ha a régebben nézte meg az oldalt mint a mai nap, akkor frissítjük a dátumot és hozzáadunk egyet a számlálóhoz
if ( $expire < $now ) {
 
mysql_query( " UPDATE ".$db_ips." SET expire = '$now' " );
 
$count = mysql_query( "SELECT counter FROM ".$db_ips_counter." LIMIT 1");
$rows = mysql_num_rows( $count );
while ( $rows = mysql_fetch_array( $count ) ) {
$newcounter = $rows["counter"]+1;
}
mysql_query( " UPDATE ".$db_ips_counter." SET counter = '$newcounter' " );
 
}
 
}
 
# ha nincs ilyen ip akkor beszúrjuk az adatbázisba és hozzáadunk egyet a számlálóhoz
else {
 
mysql_query("INSERT INTO ".$db_ips." (ip, expire, date) VALUES ('$realip', '$now', NOW() ) ");
 
$count = mysql_query( "SELECT counter FROM ".$db_ips_counter." LIMIT 1");
$rows = mysql_num_rows( $count );
while ( $rows = mysql_fetch_array( $count ) ) {
$newcounter = $rows["counter"]+1;
}
mysql_query( " UPDATE ".$db_ips_counter." SET counter = '$newcounter' " );
 
}
 
# itt olvassuk ki, hogy hányan nézték meg eddig az oldalt
$count = mysql_query( "SELECT counter FROM ".$db_ips_counter." LIMIT 1");
$rows = mysql_num_rows( $count );
while ( $rows = mysql_fetch_array( $count ) ) {
$osszes = $rows["counter"];
}
 
# itt pedig a mai látogatók számát olvassuk ki
$count = mysql_query( "SELECT expire FROM ".$db_ips." WHERE expire = '$now'");
$rows = mysql_num_rows( $count );
$mai = $rows;
 
# session-k száma alapján megszámoljuk, hányan vannak online (így pontos értéket kapunk), session-be viszont regisztrálni kell egy értéket, hogy számolható legyen
$online = count($_SESSION);
 
# kiírjuk a kapott adatokat
print "Összes látogató: ".$osszes.", Ma: ".$mai.", Online: ".$online.".";
 
mysql_close($kapcsolodas);
 
}
 
?>

A függvényünk elején ellenőrizzük a felhasználó ip címét, ezzel a kódrészlettel (hellyel-közzel) megkapjuk a felhasználónk valós ip-jét. Lentebb beszúrjuk a mysql_connect.php fájlunkat így létrehozzuk a kapcsolatot az adatbázisunkkal, majd a $now változóba beletesszük a mai napot.

Következő lépés, hogy ellenőrizzük, hogy a felhasználó látogatta-e már az oldalunkat. Ha a felhasználó ip címe szerepel az adatbázisunkban akkor (valószínűleg ő) már látogatta az oldalunkat ezért megnézzük, hogy ez a látogatás mikör történt. Naponta egy ip-ről csak egy látogatást fogadunk el, ezért, ha a felhasználó nem a mai nap (azaz régebben) nézte meg az oldalunkat, akkor először is eltároljuk a mai napot az ips táblánkban így az utolsó látogatásának idejét a mai napra tesszük, majd hozzáadunk egyet az ips_counter táblánk counter mezőjéhez így növelve az összes látogatás számát.

Gondolom feltűnt, hogy itt az if-nek nincs else ága. Azért nincs mert fölösleges lenne, ugyanis, ha nam régebben nézte meg a lapunk mint a mai nap (azaz ma nézte meg), akkor nem kell új látogatónak számolni.

Nos akkor menjünk is tovább. Az else ágban megkapjuk ugyebár, hogy még nincs ilyen ip cím az adatbázisunkban, azaz még nem látogatta ez a felhasználó az oldalunkat, úgyhogy beszúrjuk a táblánkba az ip címét, a mai dátumot (expire) és a beszúrás dátumát valamint, hozzáadunk egyet a látogató számlálónkhoz.

Ezzel az érdemi résszel meg is volnánk, most már csak a kiolvasások hiányoznak, na nézzük:
Az ips_counter táblánk counter mezőjéből kiolvassuk az összes látogatónk értékét, majd a következő kódrészlet kiolvassa az ips táblánkból azokat a sorokat, ahol az expire értéke egyenlő a mai nappal, így megtudjuk, hányan nézték meg ma az oldalunkat.

És akkor itt jön az a rész aminek a session elindítására volt szüksége. Egyszerűen egy count() függvénnyel megszámoljuk a sessionok számát a serveren.
Ezután egy print függvénnyel csak kiiratjuk az értékeinket és lezárjuk a kapcsolatot az adatbázisunkkal.

5.) Az index.php fájl létrehozása

Ötödik lépésként hozzuk létre vagy szúrjuk be az index.php fájlunkat / fájlunkba a következő kódot:

<?php
 
include "./includes/session_start.php";
include "./includes/statistic.php";
 
session();
statistic();
 
?>

Ami fontos, hogy a session_start.php-énk szúrjuk be / hívjuk meg először, hogy a sessionok száma pontos legyen. Egyébként a session() függvény meghívását a sesseion_start.php-ban is elhelyezhetjük a függvényünk definiálása után, ekkor elég csak a session_start.php-t beszúrni az oldalunkra és nem kell meghívni külön a session() függvényt.
A statistic() függvényünket pedig ott hívjuk meg ahova ki szeretnénk iratni a látogatók, mai látogatók és az online felhasználókat.

Remélem érthetően írtam le a program működését, akinek kérdése van az a hozzászólásokban megteheti.

Sok sikert!

16 HOZZÁSZÓLÁS

  1. Hmmm… A “$online = count($_SESSION);” nem az aktuális felhasználó!! session változóinak számát adja vissza?

  2. Csatlakoznék az előttem szólóhoz…
    Ezt Te kipróbáltad élesben? És számolta is hogy hány látogató van online? Mert baromi érdekes, ugyanis a $_SESSION-t egy szuperglobális változóként (pontosabban tömbként) kezeli a php. Így ha count()-ot használsz, az eredmény a $_SESSION “tömb” elemeinek száma lesz, nem pedig a szerveren levő sessionok száma.

  3. Az alábbi kód már ténylegesen az online felhasználókat számolja:

    if ($handle=@opendir(session_save_path()))
    {
    $visitornum=0;

    while (($file=readdir($handle))!==false)
    {
    if (substr($file,0,4)==’sess’) $visitornum++;
    }

    closedir($handle);

    echo “$visitornum felhasználó online.”;
    }

    Tehát a szkript végigmegy azon könyvtár minden egyes elemén, amelyikben a munkamenet fájlok tárolódnak, és ha ‘sess’ az első 4 karaktere a fájlnak, akkor azt egy új online felhasználónak veszi. Bár ez sem tökéletes, mert ha a garbage collector ritkán ürít, akkor lehet hogy miután valaki elhagyta az oldalt, még 5 perc múlva is online-nak veszi a szkript. Mondjuk ez beállítás kérdése.

  4. Vagyis a legtöbb tárhelyen(pláne ingyenesen) teljesen megbízhatatlan, tapasztalatom szerint…
    Eleve ne lehet ilyen helyeken állítani a “session.gc_maxlifetime” ill. a “session.gc_probability” értékét sem és a sessionok “élettartama” ebben az esetben 24 perc ami elég sok az online számláláshoz…
    Ráadásul a takarítás még ritkábban történik meg…

  5. Mondjuk nem is ingyenes tárhelyre gondoltam… Egy normális “fizetős” tárhelynél általában bele lehet nyúlni a php.ini-be szkripttel. Ha meg nem, akkor meg kell kérni az üzemeltetőt, hogy állítsa át. Nem hiszem, hogy akadékoskodni fog (ha csak nem Invitel vagy T-Online a szolgáltató :P).

  6. Mondjuk valószínűleg akadekoskodni fog,de ha nem akkor “körberöhög” hogy egy ilyen gagyi script miatt akarsz belenyulni a php.ini-be….

  7. sziasztok!
    nekem ezzel a 2 sor kiegészítéssel úgy tűnik működik, bár teljes tesztet holnap tudok majd nézni.

    1
    2
    
    session_save_path('./sessions');
    ini_set('session.gc_probability', 1);

    remélem segít valakinek!

    egyébként meg kösz a forrást!

  8. Egy kis segítséget kérek a kódhoz. Kipróbáltam localhoston az sql be az adatokat be írja viszont nem ír ki semmit mi lehet a hiba?

  9. Ronyn Tudsz ajánlani valami freet ami sql alapú, session al működik, méri az online, és az összes látogatókat, és opcionálisan megtudom jeleníteni heti havi évei stb.. időszakú látogatók számát.

    Köszi

  10. Ronyn Köszi a figyelmeztetést. Egy kérdés te milyen freet tudsz ajánlani ami sql és session alapú, méri az online ok számát, az összes látogatók számát, és opcionálisan egy adott időszak látogatóinak a számát.

    Köszi.:

  11. Nem tudom, de session alapuban nem is fogsz találni értelmeset, mert azt nem arra találták ki

  12. Google-van beirod hogy “free counter” és dob ki sok találatot, lehet belőle válogatni

  13. sziasztok,

    valaki kipróbálta a
    CREATE TABLE ‘ips’ (
    ‘id’ INT(11) NOT NULL AUTO_INCREMENT,
    ‘ip’ VARCHAR(16),………stb
    Csak nálam nem müködik?

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét