Autor Zpráva
jeang
Profil *
Ahoj, chtěl jsem se zeptat. Zakládám jedno uživatelské rozhraní. Mám tam stav online a offline. Online je jednoduchý, při přihlášení se jen přepíše online na hodnotu 1. Ale problém je v tom, že někdo opouští aplikace, tak že zavře prohlížeč, takže se neodešle do databáze hodnota 0, aby ostatní uživatele věděli, že už tam není.

Nevíte, jak by se toto dalo řešit? Děkuji
Kcko
Profil
jeang:
A proč potřebuješ mít u uživatele hodnotu 0?
Tobě stačí k uživateli ukládat čas poslední akce. A poté zjištíš online uživatele tak, že vybereš z databáze všechny uživatele s časem za poslední 3-4 min.
dan55
Profil
Ahoj,
ulož si čas poslední aktivity uživatele místo toho online 1 a 0 (musíš po každém načtení stránky uložit čas) do DB, a uživatele online vybírej uživatele takto: poslední aktivita je menší než 5 minut nebo míň.
jeang
Profil *
Ahoj, dík za info, ale tak to není myšleno. Chtěl bych, aby ostatní uživatele věděli, že tam je (že je online) a když odejde, tak že zavře prohlížeč a neklikne na "Odhlásit", aby věděli, že tam už není.
jeang
Profil *
Nechci řešit, to jak dlouho je neaktivní, ale pouze pokud ukončí kontakt s aplikací.
xmark
Profil
jeang:
Dva příspěvky nad tebou řeší přesně to, co chceš. Jinak to odchytit nelze.
jeang
Profil *
Nehledě, že kdybych si uložil každý klik uživatele... bylo by to tisíce zbytečných řádků a komplikací.
jeang
Profil *
Tak napadlo mě třeba onUnload
Cup
Profil
jeang:
Nehledě, že kdybych si uložil každý klik uživatele... bylo by to tisíce zbytečných řádků a komplikací.

Nemusíš ukládat tisíce řádků. stačí každému uživateli jeden údaj - a ten aktualizovat.

Tak napadlo mě třeba onUnload
Ale z tohoto chápu že chceš aby to bylo přesnější než 5 min a pomocí javascriptu po určitém časovém intervalu kontrolovat zda je má uživatel otevřené okno s tvojí stránkou nebo ne. Nebo ne?
jeang
Profil *
Ne, když někdo klikne na Odhlásit --- "?log=out", tak se mu do databáze uloží nula. Pak se všem zobrazí že tam není. Když nevyvolá událost klikem, ale zavře prohlížeč, tak by mohl přijít na řadu onUnload s window.location.href=?log=out
jeang
Profil *
To samozřejmě je varianta, nechat tam bez podmínky běhat UPDATE řádku v tabulce, ale tohle mi taky docela přijde v hod....
jeang
Profil *
Tak nic, nefunguje to... jakmile přidám ke stránce ?neco, tak mě pošle k čertu. Škoda, že PHP neumí automaticky rozeznat, že někdo opustil aktuální stránku (neco.cz).
Keeehi
Profil
jeang:
To je jasné, že to PHP neumí. Ono ani nemůže umět. Jelikož běží na servru, tak po té, co odešle uživateli hotovou stránku se o něj více nestará. "Probudí se," až když dostane požadavek na novou stránku.
jeang
Profil *
Škoda, že nemůžu ani nastavit server, který při ukončení spojení s klientem není schopen odeslat poslední dotaz do databáze po ukončení prohlížeče.
Keeehi
Profil
jeang:
Asi jsi to nepochopil. Žádné trvalé „spojení s klientem“ není. Server jenom odpovídá na požadavky které mu přijdou. Není možné, aby iniciátorem komunikace byl server. Ono by se to taky blbě provádělo, když za jednou IP adresou může být více počítačů.
Krakatoa
Profil
jeang:
No tak javascriptem dělej každých x vteřin (podle toho jak to chceš mít přesný) ping na nějaký php odchýtávací script na serveru a je to.
jeang
Profil *
Javascriptem to nejde, protože, když ukončíš prohlížeč z lišty ve Windows, tak si taky moc nepomůžeš (bůh ví :-)). Bez toho časového limitu mi to prostě nejde. A jak pracuje server vím. Ta věta "Škoda... atd" byla spíše přacího charakteru.
Krakatoa
Profil
jeang:
Fain, jak koukám, na tebe musí člověk pomalu.
Takže polopaticky:
Dejme tomu, že chceš mít přesnost ověření menší než 5 vteřin. Dáš do stránky javascript, který v cyklu spouští PHP script na serveru každých 5 vteřin. Ten PHP script uloží do databáze poslední spuštění tohoto scriptu u daného uživatele. Pak si dáš vypsat všechny spuštění do 5. vteřin a máš online uživatele.
Jinak to asi nende (a pokud jo, tak to je nad mé chápání), já chtěl zjišťovat, kdy táhne protihráč v šachách a taky to mám vyřešené tak, že se pořád dokola volá server javascriptem (i když todle to je trošku jiný příklad).
Cup
Profil
Krakatoa:
Ten ping php souboru javascriptem jsem měl na mysli. Dle mě nejefektivnější řešení, když člověk pomine to, že to neni 100%
Alphard
Profil
Dejme tomu, že chceš mít přesnost ověření menší než 5 vteřin.
Takové přesnosti v praxi zřejmě nedosáhne. Uživatelé prohlíží paralelně více stránek v panelech, smysl těchto stavů online/offline vidím spíše v přibližné informaci. Pingovat server každých 5 sekund kvůli online stavu se mi zdá naprosto zbytečné.
Pokud se tedy jeang nesnaží vytvořit nějakého webového IM klienta, ale s těmito znalostmi asi ne.
jeang
Profil *
Ale já nejsem blbec, už včera večer jsem to udělal .-)
jeang
Profil *
Udělal jsem to následně.

Při přihlášení se uživatel pomocí HEADER dostane na aplikace.php, tam už běží zjištění řádku uživatele pomocí ID, pak následně UPDATE pomocí Time() daného řádku. Pak začne běžet funkce o tom že minulá hodnota + 300 nesmí být menší než aktuální Time(), jinak offline a odevzdá červený image. To samé platí u cyklu while.
jeang
Profil *
Není třeba si hrát se serverem...
JendaZ
Profil *
A nebude to zbytečný záhul na databázi, když bude online 30 uživatelů a každý bude jednou za několik sekund updatovat tabulku?
candiess
Profil
a co kdyby si do body přidal událost onUnload
<body onUnload="funkce_odhlaseni()"></body>

hm.? :)

Funkce onUnload se provede pokaždé, když uživatel opustí stránku, to znamená že ta funkce se provede ještě před uzavřením stránky..:))
- potom bys mohl třeba přes jquery..
<script type="text/javascript">
function funkce_odhlas() {
$.get("index.php?logout=yes" , function() {});
return true;
}</script>


je to kod z hlavy, prosím nekártačujte mě za případné chyby :D :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0