Autor | Zpráva | ||
---|---|---|---|
Cumilecinecek Profil |
#1 · Zasláno: 18. 11. 2013, 12:10:05 · Upravil/a: Moderátor (editace znemožněna) 18. 11. 2013, 13:19:06
Dobrý den,
již delší dobu řeším problém výpisu všech přihlášených uživatelů na webu. Každý uživatel se přes formulář přihlásí (autentizace proběhne v databázi) do privátní sekce, čímž je mu registrována session proměnná. Session proměnná je však viditelná pouze pro daného uživatele (PC), dokonce jen pro jeho jeden konkrétní prohlížeč, v kterém se přihlásil. Já bych ale chtěl, aby se VŠEM přihlášeným uživatelům vypisovali VŠICHNI ostatní přilášení uživatelé. Napadlo mě tedy ukládat informace o přihlášení do databáze -> po přihlášení jsem vložil řádek o identitě uživatele do db, po odhlášení jsem ho smazal. To funguje výborně do chvíle, kdy uživatel nepoužije tlačítko odhlásit, ale jednoduše zavře prohlížeč. Potom se mu zruší session proměnná, tedy pro systém končí jeho přihlášení v privátní sekci. V databázi je ale stále vložen řádek o přihlášení a jeho jméno se tak stále vypisuje. Otázka zní: "Je možné pomocí PHP zjistit, že byl zavřen prohlížeč? Spíše ne. Lze sdílet session proměnné mezi více prohlížeči? Spíše ne... V případě triggerů v db, které by řádek smazaly po vypršení timeoutu, může docházet ke smazání před reálným odhlášením. A stejně je to dost krkolomné řešení. Bohužel mě jiná možnost nenapadá a googlovaní nějakého řešení mě taktéž nikam neposunulo. Pokud máte prosím někdo zkušenost, popř. víte, jaký mechanismus/technologie je pro řešení tohoto problému nejlepší, velmi byste mně pomohli." Moderátor Alphard: Upravil jsem nadpis vlákna tak, aby lépe vystihoval rozvíjející se diskusi.
|
||
Alphard Profil |
#2 · Zasláno: 18. 11. 2013, 12:14:25
Obvykle se to řeší aktualizací data posledního přístupu uloženého v databázi. Pak se za online považuji uživatelé, který něco udělali např. v posledních 10 minutách. Kdyby vám šlo o nějakou kontrolu ve stylu mám stránku otevřenou na pozadí, ale nic nedělám, je třeba, aby se nějaká js smyčka pravidelně hlásila serveru, že je pořád aktivní.
|
||
_es Profil |
#3 · Zasláno: 18. 11. 2013, 12:14:34
Cumilecinecek:
Môžeš zobrazovať prihlásených, ktorý vyvinuli nejakú aktivitu za posledných niekoľko minút. |
||
Cumilecinecek Profil |
#4 · Zasláno: 18. 11. 2013, 12:46:38
Dobře, asi není třeba zcela striktního určení přihlášen/nepříhlášen. Tedy např. každých 10 min by se mi spustil trigger v db a smazal všechny řádky, které by byly starší deseti minut. V případě obnovené aktivity by se zase vložil s novým časem. Jakým způsobem efektivně kontrolovat tuto aktivitu? Při načtení obsahu na všech privátních (nutné být přihlášen) stránkách provést rovnou aktualizaci času v databázi, na každé veřejné stránce kontrolovat, jestli je uživatel přihlášen a až v případě, že ano, provést aktualizaci času v db? To by asi bylo řešením. Je však efektivní?
|
||
Alphard Profil |
#5 · Zasláno: 18. 11. 2013, 12:57:26
triggery nejsou určeny k periodickému spouštění v závislosti na čase, celkově to moc komplikujete. Do tabulky s uživateli stačí přidat sloupec
last_activity a při každé akci přihlášeného uživatele provést update users set last_activity = now() where ... .
|
||
peta Profil |
#6 · Zasláno: 18. 11. 2013, 14:08:29
"kdy uživatel nepoužije tlačítko odhlásit, ale jednoduše zavře prohlížeč" (Cumilecinecek)
google = js onbeforeunload "js smyčka pravidelně hlásila serveru" (Alphard) google = js setInterval "každých 10 min by se mi spustil trigger v db a smazal všechny řádky" (Cumilecinecek) google = cron google = cron php google = cron linux google = mysql UPDATE Ale je to zcela neefektivni, promazavat v tak kratkem case databbazi, kdyz pocet ruznych prihlaseni neprekroci obvykle 50 za 5 min a za cely rok rekneme 300. Databaze zvladne najit mezi miliony zaznamu za par ms 50 radku, kde je datum mensi nez cislo. |
||
Cumilecinecek Profil |
#7 · Zasláno: 18. 11. 2013, 15:48:39
Díky moc všem. Vyřešil jsem to přidáním řádku od tabulky uživatel, kam ukládám time() poslední aktivity. Pokud je starší 10 min, nevypisuji uživatele jako přihlášeného.
|
||
Časová prodleva: 10 let
|
0