Autor Zpráva
Cumilecinecek
Profil
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
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
Cumilecinecek:
Môžeš zobrazovať prihlásených, ktorý vyvinuli nejakú aktivitu za posledných niekoľko minút.
Cumilecinecek
Profil
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
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
"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
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.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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