Phorum.ro
Your Avatar Welcome to Phorum.ro!
If you haven't registered yet, click here!
Attention Visitor:
You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.
Du-te înapoi   Phorum.ro > Web Design & Web Development > Programare > PHP > Discutii Generale

Discutii Generale Discutii generale despre PHP.

Răspunde
 
Thread Tools Moduri de afișare
Vechi 16.03.2010   #1
paul alexandru
16-Bit Member
 
Data înregistrării: 17.11.2009
Mesaje: 26
Rep Power: 3
paul alexandru is on a distinguished road
Implicit script de detectare a userilor online

stiti cumva un script de detectare cati useri sunt online pe site? script php/ajax ceva. pe cat posibil in timp real. ..asta e intrebarea..cum poti face ca in acelas timp cand iese un utilizator de pe un site, toti ceilalti sa stie ca el a iesit. automat users online sa fie decrementat cu 1.

aveati vreo idee viabila?
paul alexandru is offline   Reply With Quote
Sponsored Links
Vechi 16.03.2010   #2
Luxian
Spamofob
 
Luxian's Avatar
 
Data înregistrării: 26.06.2006
Locație: Timișoara
Vârsta: 25
Mesaje: 395
Rep Power: 6
Luxian is on a distinguished road
Trimite un mesaj prin Yahoo pentru Luxian
Implicit

Creezi o baza de date cu "sesiuni":
  • id_sesiune - primary key (varchar 100)
  • ultima_accesare - int (aici o sa salvezi timpul in unix timestamp)
  • ip - optional
La fiecare accesare a paginii:
  • stergi din baza de date toate inregistrarile mai vechi de x minute
  • verifici daca session_id() se gaseste in baza de date, daca da ii modifici timestampul pentru ultima accesare daca nu il adaugi

La afisare e suficient sa extragi numarul sesiunilor active in ultimele 5 minute (valoare folosita curent):
Cod PHP:
$sql "SELECT COUNT(*) AS `vizitatori_online` FROM `sesiuni` WHERE  `ultima_accesare`>".(time() - 60 );
$vizitatori mysql_fetch_assoc(mysql_query($sql));
echo 
$vizitatori['vizitatori_online']; 
__________________
www.luxian.ro | "Prieten e cel care te învață să pescuiești, nu cel care îți dă pește!"
Oo==oO | w210 owner

Last edited by Luxian; 17.03.2010 at 10:20:01.
Luxian is offline   Reply With Quote
Vechi 17.03.2010   #3
paul alexandru
16-Bit Member
 
Data înregistrării: 17.11.2009
Mesaje: 26
Rep Power: 3
paul alexandru is on a distinguished road
Implicit re

Citat:
În prealabil postat de Luxian Vezi mesajul
Creezi o baza de date cu "sesiuni":
  • id_sesiune - primary key (varchar 100)
  • ultima_accesare - int (aici o sa salvezi timpul in unix timestamp)
  • ip - optional
La fiecare accesare a paginii:
  • stergi din baza de date toate inregistrarile mai vechi de x minute
  • verifici daca session_id() se gaseste in baza de date, daca da ii modifici timestampul pentru ultima accesare daca nu il adaugi

La afisare e suficient sa extragi numarul sesiunilor active in ultimele 5 minute (valoare folosita curent):
Cod PHP:
$sql "SELECT COUNT(*) AS `vizitatori_online` FROM `sesiuni` WHERE  `ultima_accesare`>".(time() - 60 );
$vizitatori mysql_fetch_assoc(mysql_query($sql));
echo 
$vizitatori['vizitatori_online']; 
asta inseamna ca atunci cand un user iese din pagina, el nu o sa fie in timp real scos din afisare ca si vizitator online nu?
paul alexandru is offline   Reply With Quote
Vechi 17.03.2010   #4
Luxian
Spamofob
 
Luxian's Avatar
 
Data înregistrării: 26.06.2006
Locație: Timișoara
Vârsta: 25
Mesaje: 395
Rep Power: 6
Luxian is on a distinguished road
Trimite un mesaj prin Yahoo pentru Luxian
Implicit

Da, nu e chiar "real-time".

Dacă vrei să te complici, adaugi câteva interogări AJAX la metoda de mai sus (care să confirme că respectivul încă mai are pagina deschisă), dar asta nu o să funţioneze dacă are Javascript dezactivat.

Ca să scapi de AJAX, poţi să pui un iframe ascuns, în care să încarci o pagină goala cu autorefresh.

Cu una din metodele de mai sus, poţi să scazi intervalul de la ultima vizită (ca să consideri vizitatorul online) până la 30 de secunde.

Pentru chestii "real-time", de exemplu cum foloseşte Google-ul, Meebo, şi altele, trebuie o tehnică mai aparte de request-uri AJAX (vezi articolul ăsta de pe wikipedia).

De ce anume ai nevoie de real-time pe chestia asta? Poate reuşim să găsim alternative.
__________________
www.luxian.ro | "Prieten e cel care te învață să pescuiești, nu cel care îți dă pește!"
Oo==oO | w210 owner
Luxian is offline   Reply With Quote
Vechi 17.03.2010   #5
paul alexandru
16-Bit Member
 
Data înregistrării: 17.11.2009
Mesaje: 26
Rep Power: 3
paul alexandru is on a distinguished road
Implicit re

Citat:
În prealabil postat de Luxian Vezi mesajul
Da, nu e chiar "real-time".

Dacă vrei să te complici, adaugi câteva interogări AJAX la metoda de mai sus (care să confirme că respectivul încă mai are pagina deschisă), dar asta nu o să funționeze dacă are Javascript dezactivat.

Ca să scapi de AJAX, poți să pui un iframe ascuns, în care să încarci o pagină goala cu autorefresh.

Cu una din metodele de mai sus, poți să scazi intervalul de la ultima vizită (ca să consideri vizitatorul online) până la 30 de secunde.

Pentru chestii "real-time", de exemplu cum folosește Google-ul, Meebo, și altele, trebuie o tehnică mai aparte de request-uri AJAX (vezi articolul ăsta de pe wikipedia).

De ce anume ai nevoie de real-time pe chestia asta? Poate reușim să găsim alternative.
de fapt eu vreau sa fac altceva, insa m-am gandit sa pornesc incetuc.
prima metoda data, e interesanta insa destul de nesatisfacatoare, in sensul ca ..poate am un articol mare pe pagina, iar la un user ii ia 8 9 min sa il citeasca + ca poate mai merge pana la baie intre timp si o sa ramana pe aceeasi pagina timp de 15 min (deci fara sa aiba activitate)...automat eu l-as scoate din baza de date si nu va mai fi contorizat. la fel si cei care sunt afisati...aceasi problema poate fi si cu acestia, sa nu socotesc pe unii care sunt pe site si imi sunt si in baza de date..

Trecand mai departe, cu ce vreau sa fac cu adevarat. Ai jucat vreodata sah pe yahoo games? vreau sa fac o pagina pe care cand intri ai un input type text si un buton. in input iti introduci numele si cand apesi pe buton iti dispar acestea si iti apare 1. Numele tau ...iar toti cei care mai sunt pe pagina respectiva sa le apara numele tau..in timp real..cum ca te-ai logat..un multiplayer game de fapt. Un game in care toti trebe sa te vada in momentul in care ai intrat. Ca un chat sa zic asa. Cand ai intrat in camera, trebe sa le apari in lista celorlalti instant.

Ce zici de asta? :d
paul alexandru is offline   Reply With Quote
Vechi 17.03.2010   #6
Luxian
Spamofob
 
Luxian's Avatar
 
Data înregistrării: 26.06.2006
Locație: Timișoara
Vârsta: 25
Mesaje: 395
Rep Power: 6
Luxian is on a distinguished road
Trimite un mesaj prin Yahoo pentru Luxian
Implicit

Ce vrei tu se preateaza la tehnica aceea speciala de care ti-am zis.

O varianta mai simpla ar fi cu request-uri AJAX periodice, dar o sa trebuiasca optimizate si e ceva de munca, mai ales pe testare. Eu am facut la un moment dat un chat, si m-am chinuit putin.

La ce vrei tu sa faci iti trebuie oricum tabela aceia de sesiune. Mai adaugi in schimb niste request-uri periodice AJAX:
  • Sa verifici daca s-a modificat lista cu useri online
  • Sa verifici daca au aparut mesaje noi in chat, si daca da sa le incarci
  • Sa transmiti ca vizitatorul este inca online: asta nu cred ca mai e nevoie, din moment ce ruleaza cele 2 requesturi de mai sus, ii actualizezi ultima interogare in functie de ele.

Incearca pentru inceput sa faci doar partea de login/chat & useri online.

PS: partea cu request-uri o sa-ti faca ceva trafic pe server, la mai multi utilizatori (10-20) e posibil sa-ti mearga foarte greu daca nu faci optimizarile necesare pentru micsorarea volumului de date transferat...
__________________
www.luxian.ro | "Prieten e cel care te învață să pescuiești, nu cel care îți dă pește!"
Oo==oO | w210 owner
Luxian is offline   Reply With Quote
Vechi 17.03.2010   #7
paul alexandru
16-Bit Member
 
Data înregistrării: 17.11.2009
Mesaje: 26
Rep Power: 3
paul alexandru is on a distinguished road
Implicit re

ajax folosesc si eu si atunci cand un utilizator merge pe o pagina poate fi afisat la timp, insa cand iese de pe o pagina...aici e problema. nu poti decat estima ? altfel mai precis oare nu se poate? am citit si articolul acela

deci in momentul in care tu ai iesit de pe site, automat mie sa imi dispari din lista...

Last edited by paul alexandru; 17.03.2010 at 13:02:22.
paul alexandru is offline   Reply With Quote
Vechi 17.03.2010   #8
Luxian
Spamofob
 
Luxian's Avatar
 
Data înregistrării: 26.06.2006
Locație: Timișoara
Vârsta: 25
Mesaje: 395
Rep Power: 6
Luxian is on a distinguished road
Trimite un mesaj prin Yahoo pentru Luxian
Implicit

Pai cand vrei sa vezi daca userul e online, cauti in tabela de sesiuni si vezi care a are activitate in ultimele 3 secunde de exemplu.

Iar actualizarea ultimei activitati o faci astfel:
  • cand userul incarca pagina
  • de fiecare daca cand primesti de la user un request ajax

Iar requestu-urile AJAX poti sa le faci din 2 in 2 secunde, si o sa ai requesturi pentru:
  • chat (daca sunt mesaje noi, daca da, descarca-le)
  • requesturi pentru actualizarea listei de useri online

Astfel, o sa ajungi la intarzieri fata de real time de ordinul a catorva secunde (2 sau 3), ceea ce mi se pare ok.

Daca te pricepi la optimizare, poti sa reduci delay-ul pana la 1.5 secunde. Eu de exemplu la chat am reusit sa fac request-uri AJAX odata la 1.2 secunde fara probleme cand sunt multi useri online si 0.75s pentru cativa useri online. Sunt convins ca merge si mai putin, doar ca era putin mai mult de munca.
__________________
www.luxian.ro | "Prieten e cel care te învață să pescuiești, nu cel care îți dă pește!"
Oo==oO | w210 owner
Luxian is offline   Reply With Quote
Vechi 17.03.2010   #9
paul alexandru
16-Bit Member
 
Data înregistrării: 17.11.2009
Mesaje: 26
Rep Power: 3
paul alexandru is on a distinguished road
Implicit

Citat:
În prealabil postat de Luxian Vezi mesajul
Pai cand vrei sa vezi daca userul e online, cauti in tabela de sesiuni si vezi care a are activitate in ultimele 3 secunde de exemplu.

Iar actualizarea ultimei activitati o faci astfel:
  • cand userul incarca pagina
  • de fiecare daca cand primesti de la user un request ajax

Iar requestu-urile AJAX poti sa le faci din 2 in 2 secunde, si o sa ai requesturi pentru:
  • chat (daca sunt mesaje noi, daca da, descarca-le)
  • requesturi pentru actualizarea listei de useri online

Astfel, o sa ajungi la intarzieri fata de real time de ordinul a catorva secunde (2 sau 3), ceea ce mi se pare ok.

Daca te pricepi la optimizare, poti sa reduci delay-ul pana la 1.5 secunde. Eu de exemplu la chat am reusit sa fac request-uri AJAX odata la 1.2 secunde fara probleme cand sunt multi useri online si 0.75s pentru cativa useri online. Sunt convins ca merge si mai putin, doar ca era putin mai mult de munca.

da..dar userul poate sa fie pe site si sa nu execute un apel ajax, adica sa fie pasiv 10 sec...deci sa nu aiba activitate..nu il pot trece ca si cum ar fi offline

sarind peste partea cu chat...pt inceput ar fi foarte bine doar partea cu intrarea pe site si cu iesirea de pe site sa fie conceputa. cum e pe meebo lista de prieteni...cand intra unu online, instant tie iti apare in lista si cand iese, instant iti iese si tie. asta as vrea sa fac.

o aplicatie web de 2 utilizatori (pt inceput) care pot intra pe o pagina si in momentul in care isi introduc numele automat sa ii apara celuilalt vizitator pe pagina cum ca este online.

deci intru eu imi scriu numele apas butonul "intra" si automat tie sa iti apara 1. paul
iar cand iti introduci si tu numele si apesi "intra", sub numele meu sa apara 2. luxian si la fel si pe pagina mea sa apara acelas lucru...

iar cand iesi sa imi dispara mie de pe pagina numele tau si sa ramana doar al meu

Last edited by paul alexandru; 17.03.2010 at 13:14:17.
paul alexandru is offline   Reply With Quote
Vechi 17.03.2010   #10
Luxian
Spamofob
 
Luxian's Avatar
 
Data înregistrării: 26.06.2006
Locație: Timișoara
Vârsta: 25
Mesaje: 395
Rep Power: 6
Luxian is on a distinguished road
Trimite un mesaj prin Yahoo pentru Luxian
Implicit

Requesturile AJAX se fac automat, fara ca userul sa faca nimic (nu trebuie sa apese nici un buton / tasta si nici macar sa miste mouse-ul).

Pentru aceste requesturi trebuie sa faci o functie recursiva, care se apeleaza la incarcarea paginii.

Functia va avea forma de genu':
Cod HTML:
<script type="text/javascript">
function automaticAjaxRequests(){
    // ... cod functie
   setTimeout('automaticAjaxRequests()', 1000); // a 2a valoare in milisecunde si reprezinta timpul intre requesturi
}
</script>
Functia aceasta trebuie apelata cand pagina se incarca. Daca folosesti jQuery ca framework javascript (ceea ce iti recomand pentru a scutii o mare parte din munca), poti sa apelezi functia asa:

Cod:
$(document).ready(function(){automaticAjaxRequests();})
Daca nu folosesti nici un framework javascript, poti sa pui:
Cod:
< body onload="automaticAjaxRequests();" ....
__________________
www.luxian.ro | "Prieten e cel care te învață să pescuiești, nu cel care îți dă pește!"
Oo==oO | w210 owner

Last edited by Luxian; 17.03.2010 at 13:21:35.
Luxian is offline   Reply With Quote
Vechi 17.03.2010   #11
paul alexandru
16-Bit Member
 
Data înregistrării: 17.11.2009
Mesaje: 26
Rep Power: 3
paul alexandru is on a distinguished road
Implicit

Citat:
În prealabil postat de Luxian Vezi mesajul
Requesturile AJAX se fac automat, fara ca userul sa faca nimic (nu trebuie sa apese nici un buton / tasta si nici macar sa miste mouse-ul).

Pentru aceste requesturi trebuie sa faci o functie recursiva, care se apeleaza la incarcarea paginii.

Functia va avea forma de genu':
Cod HTML:
<script type="text/javascript">
function automaticAjaxRequests(){
    // ... cod functie
   setTimeout('automaticAjaxRequests()', 1000); // a 2a valoare in milisecunde si reprezinta timpul intre requesturi
}
</script>
Functia aceasta trebuie apelata cand pagina se incarca. Daca folosesti jQuery ca framework javascript (ceea ce iti recomand pentru a scutii o mare parte din munca), poti sa apelezi functia asa:

Cod:
$(document).ready(function(){automaticAjaxRequests();})
Daca nu folosesti nici un framework javascript, poti sa pui:
Cod:
< body onload="automaticAjaxRequests();" ....

ah..da...ms mult

Citat:
În prealabil postat de Luxian Vezi mesajul
Requesturile AJAX se fac automat, fara ca userul sa faca nimic (nu trebuie sa apese nici un buton / tasta si nici macar sa miste mouse-ul).

Pentru aceste requesturi trebuie sa faci o functie recursiva, care se apeleaza la incarcarea paginii.

Functia va avea forma de genu':
Cod HTML:
<script type="text/javascript">
function automaticAjaxRequests(){
    // ... cod functie
   setTimeout('automaticAjaxRequests()', 1000); // a 2a valoare in milisecunde si reprezinta timpul intre requesturi
}
</script>
Functia aceasta trebuie apelata cand pagina se incarca. Daca folosesti jQuery ca framework javascript (ceea ce iti recomand pentru a scutii o mare parte din munca), poti sa apelezi functia asa:

Cod:
$(document).ready(function(){automaticAjaxRequests();})
Daca nu folosesti nici un framework javascript, poti sa pui:
Cod:
< body onload="automaticAjaxRequests();" ....
folosesc prototype
paul alexandru is offline   Reply With Quote
Vechi 17.03.2010   #12
Luxian
Spamofob
 
Luxian's Avatar
 
Data înregistrării: 26.06.2006
Locație: Timișoara
Vârsta: 25
Mesaje: 395
Rep Power: 6
Luxian is on a distinguished road
Trimite un mesaj prin Yahoo pentru Luxian
Implicit

Prototype nu am folosit pana acum. Dar din cate am observat seamana foarte mult cu jQuery.

Spor cu dezvoltarea aplicatiei. Si sa ne tii la curent.
__________________
www.luxian.ro | "Prieten e cel care te învață să pescuiești, nu cel care îți dă pește!"
Oo==oO | w210 owner
Luxian is offline   Reply With Quote
Vechi 17.03.2010   #13
paul alexandru
16-Bit Member
 
Data înregistrării: 17.11.2009
Mesaje: 26
Rep Power: 3
paul alexandru is on a distinguished road
Implicit

Citat:
În prealabil postat de Luxian Vezi mesajul
Creezi o baza de date cu "sesiuni":
  • id_sesiune - primary key (varchar 100)
  • ultima_accesare - int (aici o sa salvezi timpul in unix timestamp)
  • ip - optional
La fiecare accesare a paginii:
  • stergi din baza de date toate inregistrarile mai vechi de x minute
  • verifici daca session_id() se gaseste in baza de date, daca da ii modifici timestampul pentru ultima accesare daca nu il adaugi

La afisare e suficient sa extragi numarul sesiunilor active in ultimele 5 minute (valoare folosita curent):
Cod PHP:
$sql "SELECT COUNT(*) AS `vizitatori_online` FROM `sesiuni` WHERE  `ultima_accesare`>".(time() - 60 );
$vizitatori mysql_fetch_assoc(mysql_query($sql));
echo 
$vizitatori['vizitatori_online']; 
aici de ce ai facut time() - 5 * 60 ? time() returneaza numarul de secunde din 1970 nu? deci nu trebuia sa faci doar time() - 5 , userii care nu s activi de 5 secunde?

Citat:
În prealabil postat de Luxian Vezi mesajul
Prototype nu am folosit pana acum. Dar din cate am observat seamana foarte mult cu jQuery.

Spor cu dezvoltarea aplicatiei. Si sa ne tii la curent.
am rezolvat..am facut un script de baza pt monitorizarea in timp real fara refresh de pagina, cu ajax, a vizitatorilor online

aici e linkul http://ileapaulalexandru.ro/online_status/

Iar pentru cei care vor sa incerce si ei, daca nu vor sa isi mai bata capul, am facut un articol explicat cu tot scriptul necesar cap coada http://browserul-meu.ileapaulalexand...timp-real.html

Last edited by paul alexandru; 18.03.2010 at 00:50:21.
paul alexandru is offline   Reply With Quote
Vechi 19.03.2010   #14
Luxian
Spamofob
 
Luxian's Avatar
 
Data înregistrării: 26.06.2006
Locație: Timișoara
Vârsta: 25
Mesaje: 395
Rep Power: 6
Luxian is on a distinguished road
Trimite un mesaj prin Yahoo pentru Luxian
Implicit

O singură observație ar trebui făcută:

Tu consider un vizitator unic pentru fiecare IP. Ceea ce nu e corect decât în puține cazuri. De exemplu angajații unei firme apar ca fiind același utilizator (un singur ip extern pentru toată firma).

De aceea eu am recomandat să folosești session_id(). Id-ul acela e unic pentru fiecare vizitator si nu tine de ip. Plus ca in functie de setarile serverului se salveaza automat in cookies (ca nu cumva sa i se atribuie un alt session id vizitatorului dupa ce acesta face o pauza mai mare).

Singurul lucru care se calculeaza dupa ip in ziua de azi sunt vizitatorii unici ai unui site. In rest, totul se face folosind o combinatie de cookies,user-agent, IP si headerul X-FORWARDED-FOR, si multe alte chestii extrase fie cu javascript fie cu flash.

Un script de genul celui facut de tine ar trebui sa afiseze 2 vizitatori cand il deschid in 2 browserere diferite. Al tau afiseaza doar 1.
__________________
www.luxian.ro | "Prieten e cel care te învață să pescuiești, nu cel care îți dă pește!"
Oo==oO | w210 owner
Luxian is offline   Reply With Quote
Vechi 20.03.2010   #15
paul alexandru
16-Bit Member
 
Data înregistrării: 17.11.2009
Mesaje: 26
Rep Power: 3
paul alexandru is on a distinguished road
Implicit

Citat:
În prealabil postat de Luxian Vezi mesajul
O singură observație ar trebui făcută:

Tu consider un vizitator unic pentru fiecare IP. Ceea ce nu e corect decât în puține cazuri. De exemplu angajații unei firme apar ca fiind același utilizator (un singur ip extern pentru toată firma).

De aceea eu am recomandat să folosești session_id(). Id-ul acela e unic pentru fiecare vizitator si nu tine de ip. Plus ca in functie de setarile serverului se salveaza automat in cookies (ca nu cumva sa i se atribuie un alt session id vizitatorului dupa ce acesta face o pauza mai mare).

Singurul lucru care se calculeaza dupa ip in ziua de azi sunt vizitatorii unici ai unui site. In rest, totul se face folosind o combinatie de cookies,user-agent, IP si headerul X-FORWARDED-FOR, si multe alte chestii extrase fie cu javascript fie cu flash.

Un script de genul celui facut de tine ar trebui sa afiseze 2 vizitatori cand il deschid in 2 browserere diferite. Al tau afiseaza doar 1.

da...numai ca nu as vrea sa mi se considere doua vizite daca ma conectez eu de pe acelas calculator de pe 2 browsere diferite.
paul alexandru is offline   Reply With Quote
Vechi 20.03.2010   #16
Luxian
Spamofob
 
Luxian's Avatar
 
Data înregistrării: 26.06.2006
Locație: Timișoara
Vârsta: 25
Mesaje: 395
Rep Power: 6
Luxian is on a distinguished road
Trimite un mesaj prin Yahoo pentru Luxian
Implicit

Eu unul prefer sa ma arate de 2 ori pe mine cand sunt in browsere diferite decat sa imi arate un singur vizitator in loc de 20 care au net prin retele de cartier, firme sau laboratoare.

Plus ca nici un utilizator obisnuit nu are deschise 2 browsere simultan pentru acelasi site.
__________________
www.luxian.ro | "Prieten e cel care te învață să pescuiești, nu cel care îți dă pește!"
Oo==oO | w210 owner
Luxian is offline   Reply With Quote
Răspunde


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Moduri de afișare

Reguli de postare
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Pornit
emoticoanele sunt Pornit
Codul [IMG] este Pornit
Codul HTML este Pornit



Ora este GMT +3. Ora este acum 17:07:22.


Rulează cu: vBulletin Version 3.8.4
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Forum SEO by Zoints

XXXXXXXXXXXXXXXXXXX
Inactive Reminders By Icora Web Design