Browserul meu |
|||
|
|
|||
Trebuie sa recunosc ca m-am muncit ceva pe acest script, dar rezultatul este multumitor. Probabil ca in alte programe problema aceasta se rezolva mai elegant, exista totusi si in PHP solutie pentru asa ceva.
Va voi prezenta etapele creari unui script de detectare numarului de useri online pe un anumit site, metoda realizata in timp real, fara refresh la pagina si in acelas timp cu monitorizare a ip-ului. (de pe un ip sa se poata loga un singur user).
Cum putem face acest lucru? Bineinteles..cu Ajax. Eu am folosit prototype pentru acest lucru. Aplicatia consta in 3 fisiere si o baza de date. Fisierele le vom numi index.php , test.php si prototype.js. (se poate face download de la adresa de mai sus)
Inainte sa trecem la explicarea codului sursa, trebuie sa creati un tabel pe care il puteti denumi: users_online. Ca sa nu va mai complicati cu el faceti urmatoarea interogare in baza de date si veti avea tabelul creat.
CREATE TABLE IF NOT EXISTS `users_online` (
`ip` varchar(100) character set utf8 collate utf8_bin NOT NULL,
`ultima_accesare` bigint(100) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Inainte de a trece la primul script, trebuie sa intelegeti importanta acestui table. Tabelul are doua campuri, ip care este ip-ul utilizatorului intrat pe site si ultima_accesare, in care se tine minte ultima activitate a acestui user pe site. Aceasta activitate se masoare in secunde. (cate secunde au trecut din anul 1970 pana la ultima actiune a acestui utilizator pe site, actiune obtinuta automat atata timp cat utilizatorul este pe site)
Mai jos avem scriptul index.php:
<html>
<head>
<script type="text/javascript">
function addUser(){
new Ajax.Request('test.php',
{
method:'get',
onSuccess: function(transport){
var response = transport.responseText || "no response text";
$('users').innerHTML=response;
},
onFailure: function(){ alert('Something went wrong...') }
});
setTimeout('addUser()', 2000);
}
</script>
<script type="text/javascript" src="prototype.js"></script>
</head>
<body onload="addUser()">
<div id="users"></div>
</body>
</html>
Fisierul index.php dupa cum se vede contine un div cu id=users. In acest div va fi afisat numarul de useri care sunt online. Dupa cum se vede in momentul in care se incarca pagina se apeleaza prin onload functia javascript addUser().
Functia addUser este de fapt un apel Ajax catre fisierul test.php (pe care il vom discuta imediat), functie care se reapeleaza la fiecare 2 secunde. Deci prin aceasta functie citim cati useri sunt online, numarul userilor primindu-l in variabila response. Aceasta variabila urmeaza sa o punem in divul cu id=users prin: $('users').innerHTML=response, care inseamna acelas lucru cu document.getElementById('users').innerHTML=response. (aceasta se poate face doar daca folosim prototype.js)
Acum sa trecem la ultima parte fisierul test.php care este urmatorul:
<?php
//aici se face conexiunea la baza de date
//verifica daca userul a intrat prima data sau era deaja pe site
$query="SELECT * FROM users_online WHERE ip='".$_SERVER['REMOTE_ADDR']."'";
$result = mysql_query($query);
$num = mysql_num_rows($result);
if ($num==0){
//daca userul e nou il introducem in tabel
$curr_datetime = time();
$time=time()-3;
$query = "INSERT INTO users_online (ip, ultima_accesare) VALUES ('".$_SERVER['REMOTE_ADDR']."','".$curr_datetime."') ";
mysql_query($query);
//scoate numarul de vizitatori
$query_num="SELECT COUNT(*) AS compteur
FROM users_online
WHERE ultima_accesare>'".$time."'";
$result_num=mysql_query($query_num);
$obj=mysql_fetch_object($result_num);
print $obj->compteur;
}
else {
//daca userul e existent facem update la ultima accesare
$curr_datetime = time();
$time=time()-3;
$query="UPDATE users_online SET ultima_accesare='".$curr_datetime."' WHERE ip='".$_SERVER['REMOTE_ADDR']."'";
mysql_query($query);
//scoate numarul de vizitatori
$query_num="SELECT COUNT(*) AS compteur
FROM users_online
WHERE ultima_accesare>'".$time."'";
$result_num=mysql_query($query_num);
$obj=mysql_fetch_object($result_num);
print $obj->compteur;
}
?>
Probabil ca v-ati confruntat cu problema: cum sa iti dai seama atunci cand un user paraseste pagina noastra, nu? Care e solutia? Solutia este simpla. Orice user care se afla pe pagina noastra este monitorizat permanent. Cu ajutorul ajaxului, la fiecare 2 secunde facem un update in baza de date cu ora la care acest utilizator a fost gasit pe pagina noastra.
In momentul in care utilizatorul paraseste pagina, acel script nu se va mai executa, iar in baza de date ne va ramane ip-ul sau stocat alaturi de ora la care a fost gasit ultima data pe server.
In acelas timp cand executam acel script, scoatem din tabel toate inregistrarile (toti utilizatorii) care au activitate pe site. Ce inseamna aceasta activitate? Nimic. Doar faptul ca ei se afla pe site inseamna ca au activitate pe site, deoarece scriptul acela se executa la nesfarsit din 2 in 2 secunde atata vreme cat ei raman pe pagina noastra. Cum scoatem din baza de date numai pe cei care mai sunt online? Este simplu! La fiecare 2 secunde in baza de date se face update la ora, deci noi scoatem utilizatorii a caror timp stocat in baza de date nu este mai vechi de ora curenta minus 3 secunde.
Utilizatorii care au ramas in urma, inseamna ca au iesit de pe site, si deci timpul lor a ramas in urma. Scriptul de mai sus in prima faza se conecteza la baza de date, dupa care verifica daca ip-ul care s-a conectat pe site nu este cumva existent in baza de date. Daca el nu este existent acesta este adaugat, iar daca este existent, acestuia i se va face un update.
In acest fel un anuit utilizator nu va fi contorizat separat in cazul se hotaraste sa acceseze pagina noastra din mai multe browsere.
Daca aveti o intrebare, adaugare sau idee de imbunatatire a scriptului va invit sa imi lasati un comentariu.
2. Administrator17-07-2010 14:48:59
3. ionatan23-07-2010 09:02:26
4. kowally06-08-2010 23:31:17
5. edu02-04-2011 22:04:00
6. Administrator12-04-2011 17:47:29
7. mikele20-01-2012 19:07:42
8. Eugene28-01-2012 21:36:02
Problema opacitatii in Internet Explorer
Javascript browser detect
Ce folos are hasLayout?
Style.left nu functioneaza?
Link de recomandare pentru blogul tau
Script de detectare a userilor online in PHP in timp real
Meniu javascript
Impiedica redimensionarea unui textarea in Google Chrome si Safari
Fade in effect
PNG in IE6Toate drepturile rezervate, Ilea Paul Alexandru - viziteaza si Blogul meu Birou de Arhitectura Vlad Rusu
1. ionatan09-07-2010 21:23:39