bgcko.gif, 0 kB
Online Meter - Počitadlo online uživatelů za pomocí MySQL

V mojem prvním tutu se hodlám zabírat počítadlem online uživatelů, kteří si právě prohlížejí vaše stránky. Ale není lepší mít ten krásý pocit že jste ho dokázali splácat sami místo trapného využívání služeb jako blueboard? Wink

Celé to je malinko podvod, ale PHP prostě není na real-time server-klient akce stavěné, budeme si teda muset pomoct jednoduchou fintou.

Stanovíme si čas, po který je považován uživatel jako online (např 5 minut). Při každém načtení naší stránky s kódem počitadla se zkontroluje databáze, jestli je v ní záznam s naším návštěvníkem (jeho IP), který si stránku zrovna prohlíží. Jestli není, přidá se tam společně s časem načtení stránky (jakoby čas poslední aktivity uživatele). Jestli je, zůstane tam a jenom se přepíše čas. Pod to hodíme kód, který prostě smaže z tabulky všechny návštěvníky, kterým už čas uplynul nespustili si na svojí IP skript déle než 5 minut).

Pak už stačí jen zjistit počet řádků co nám v tabulce zbyl a vypsat jej Cool

Budeme potřebovat databázi a v ní tabulku, kterou pojmenujeme třeba "online". Tabulka by měla obsahovat ID záznamu (auto_increment a primary key), IP návštěvníka a čas jeho posledního klinutí. Takže CREATE TABLE by měl být nějak takhle:"CREATE TABLE online (id INTEGER PRIMARY KEY AUTO_INCREMENT, ip VARCHAR(15) NOT NULL, time VARCHAR(12))".

Samozřejmě že počítám s register_globals = off! Nechat si tam "on" je dost neprofesionální a nebezpečné.

A takhle by mohl vypadat kód našeho Online Meteru, vložený kdekoliv do stránky:

<?php
// připojení k databázi
$connection mysql_connect("adresa_serveru""uzivatelske_jmeno""heslo") or die ("Nepovedlo se navázat spojení se serverem");
mysql_select_db("nase_databaze") or die ("Nepodařilo se připojit k databázi");
//nastavime si aktuální čas
$time time();
//toleranci nastavíme na 5min (300sekund)
$kick_limit 300;
//zjistíme si IP návštěvníka
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  
$explode_ip explode(','$_SERVER['HTTP_X_FORWARDED_FOR']);
  
$ip $explode_ip[0];
}else{
  
$ip $_SERVER['REMOTE_ADDR'];
};
//zjistíme, jestli je v databázi podle IP
$check_result mysql_query("SELECT * FROM online WHERE ip = '$ip'");
//zapíšeme si ID našeho návštěvníka pro pozdější použití
$user mysql_fetch_array($check_resultMYSQL_ASSOC);
if(!
$check_result){
mysql_query("INSERT INTO online (ip, time) VALUES ('$ip', '$time')");
}else{
mysql_query("UPDATE online SET time = '$time' WHERE id = '{$user['id']}'");
};
//spočítáme si rozdíl časů
$kick_time $time $kick_limit;
//a všechny, co to mají čas poslední akce nižsí, vymažem
mysql_query("DELETE FROM online WHERE time < '$kick_time'");
//teď už jenom zjistíme počet zbylých řádků v tabulce a vypíšeme je
$online mysql_num_rows(mysql_query("SELECT id FROM online"));
echo 
"Počet online uživatelů: $online<br>";
//a pro jistotu ukončíme mysql spojení
mysql_close($connection);
?>

Doufám že se to dá všechno snadno pochopit =) Akorát menší nejasnosti by asi mohly vzniknout u jišťování IP a kouzlení s $_SERVER['HTTP_X_FORWARDED_FOR']. Ta je tam kvůli lidem připojeným přes proxy - proměnná $_SERVER['REMOTE_ADDR'] by nám v případě více počítačů připojených přes proxy ukázala jen adresu proxy serveru, zatímco v $_SERVER['HTTP_X_FORWARDED_FOR'] by se měly skrývat IP těc počítačů za prochy schovaných, a může jich tam být víc, proto rozdělení pomocíexplode(). Ale tady si ani já nejsem úplně jistý...

Takže připomínky prosím do diskuse a snad mě neukamenujete jestli tam mám chyby Smile

GL při tvoření vlastních Online počitadel Wink

Komentáře a hlasování
Options:      B | I | U | IMG | Code | Link | FAQ



Rate: 5-Best | 0-Wrost






 
 
#1 | Domo | 08/10/06 | 15:51:52| Site
Podle mě je měření online návštěvníků hloupost. Spíš by to chtělo udělat (né že bych ho potřeboval já) tutoriál na celkový počet unikátních návštěv.
#2 | Zephyr | 08/10/06 | 16:14:45| Site
no tak na malejch webech kam chodi treba do 100 lidi za den to fakt nema cenu... ale na vetsich webech to vyuziti urcite ma...
#3 | doublem | 08/10/06 | 16:26:31
A k čemu prosím tě.. ? Aby si viděl jak ti na warforu lidi zahlcujou DB možná tak.. :D
#4 | Zephyr | 08/10/06 | 18:04:47| Site
warforum ma pocitadlo vestaveny pokud vim. a treba presne k tomu - kdyz vidim ze jich tam je 1200 tak ani nemusim zkouset neco hledat :/ to ze to nedokazes vyuzit ty neznamena ze to nema vyuziti...
#5 | Dadas | 08/10/06 | 19:21:54
[4] Tos mu to natrel =), jinak tut pro me zatim nema vyuziti, protoze davam z PHP jen zaklad (cykly, prace se soubory) a to jen okrajove, snad to behem tohoto roku zmenim...
#6 | brade | 11/10/06 | 17:41:54| Site
no mozna bych to neresil za pomoci remote_addr ale sessions...
vetsina vetsich siti ma sdilenou IP
#7 | p360t | 13/10/06 | 07:28:40
ja som to riešil podobne, s jediným rozdielom, že som potreboval online len registrovaných. a tak som im pridal do tabuľky s loginmi jeden stĺpec, kde je uložený dátum posledného prístupu (v tých sekundách od 1. 1. 1970) a ak je tento dátum starší ako 10 minút, už sa user považuje za offline. a v podstate nič nemusím mazať. (ešte pri odhlásení to vynuluje ten dátum, aby tam neostávali tých 10 minút ako online aj po odhlásení).
#8 | shanoy | 21/10/06 | 14:50:55| Site
Čo eroxia končí či čo? Keď už tak dlho tu nieje žiadný nový tutoriál.
#9 | Zephyr | 21/10/06 | 17:28:49| Site
tak nejakej napis... tuty se neudelaj samy...
#10 | shanoy | 22/10/06 | 11:16:14| Site
som aj napisal len ho neschválili