Autor | Zpráva | ||
---|---|---|---|
jeang Profil * |
#1 · Zasláno: 24. 12. 2010, 20:28:41
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 |
#2 · Zasláno: 24. 12. 2010, 20:38:59
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 |
#3 · Zasláno: 24. 12. 2010, 20:40:37
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 * |
#4 · Zasláno: 24. 12. 2010, 20:44:16
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 * |
#5 · Zasláno: 24. 12. 2010, 20:45:32
Nechci řešit, to jak dlouho je neaktivní, ale pouze pokud ukončí kontakt s aplikací.
|
||
xmark Profil |
#6 · Zasláno: 24. 12. 2010, 20:48:25
jeang:
Dva příspěvky nad tebou řeší přesně to, co chceš. Jinak to odchytit nelze. |
||
jeang Profil * |
#7 · Zasláno: 24. 12. 2010, 20:49:27
Nehledě, že kdybych si uložil každý klik uživatele... bylo by to tisíce zbytečných řádků a komplikací.
|
||
jeang Profil * |
#8 · Zasláno: 24. 12. 2010, 20:50:25
Tak napadlo mě třeba onUnload
|
||
Cup Profil |
#9 · Zasláno: 24. 12. 2010, 21:05:59
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 * |
#10 · Zasláno: 24. 12. 2010, 21:11:57
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 * |
#11 · Zasláno: 24. 12. 2010, 21:13:18
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 * |
#12 · Zasláno: 24. 12. 2010, 21:53:37
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 |
#13 · Zasláno: 24. 12. 2010, 22:01:38
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 * |
#14 · Zasláno: 24. 12. 2010, 22:05:53
Š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 |
#15 · Zasláno: 24. 12. 2010, 22:24:11
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 |
#16 · Zasláno: 24. 12. 2010, 22:36:37
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 * |
#17 · Zasláno: 24. 12. 2010, 23:34:27
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 |
#18 · Zasláno: 25. 12. 2010, 00:38:54 · Upravil/a: Krakatoa
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 |
#19 · Zasláno: 25. 12. 2010, 10:25:22
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 |
#20 · Zasláno: 25. 12. 2010, 10:46:14 · Upravil/a: Alphard
„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 * |
#21 · Zasláno: 25. 12. 2010, 11:03:10
Ale já nejsem blbec, už včera večer jsem to udělal .-)
|
||
jeang Profil * |
#22 · Zasláno: 25. 12. 2010, 11:07:55
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 * |
#23 · Zasláno: 25. 12. 2010, 11:09:26
Není třeba si hrát se serverem...
|
||
Časová prodleva: 1 měsíc
|
|||
JendaZ Profil * |
#24 · Zasláno: 31. 1. 2011, 16:11:35
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 |
#25 · Zasláno: 31. 1. 2011, 17:33:17
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 :) |
||
Časová prodleva: 14 let
|
0