Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][MySQL][PHP]Użytkownicy online czy offline?
Forum PHP.pl > Forum > Przedszkole
Maxie
Mam do Was pytanie, jak, tak w teorii rzecz jasna sprawdzić czy użytkownik jest online? Domyślam się, że coś z pętla i bazą danych, ale to by było bardzo "interneto-ssące". Jak takie coś uczynić?
Dominator
Gdy użytkownik się loguje to w tabelce "logged" daj 1, a gdy się wylogowuje aktualizujesz na 0 wink.gif
Maxie
A gdy sesja sama się skończy? Tzw. wyjdzie ze strony, ale zalogowany będzie, aż do czasu, gdy się nie skończy sesja, i wtedy będzie pseudo online, przez cały czas, nie prawdasz?
CTRL
Przy każdym załadowaniu strony wylogowywuj tych którzy mają czas ostatniej akcji większy niż np. 10 minut, a przy każdej akcji zapisuj czas kiedy ona nastąpiła, i id usera albo sesje
Natalka
Ja robię to tak że zapisuję czas ostatniej "aktywności" w serwisie.
Na każdej podstronie sprawdzam aktywność użytkownika, razem ze skryptem sprawdzającym sesje użytkownika czy nie wygasła.

Mam taki system na kilku serwisach i działa wszedzie bez problemów i nie jest zbyt zasoobożerne.


Gdy ostatnia aktywność użytkownika jest starsza niż 5 minut, aktualizuję czas w bazie danych na teraźniejszy.
Na stronie wyświetlam użytkowników którzy byli aktywni w ciągu ostatnich 5 minut.

Czas można ustawiać według własnych zasad, u mnie 5 minut jest wystarczające.
-------

Automatycznego wylogowania nie polecam, każdy użytkownik może odejść na chwilę od komputera, podejdzie i zostanie wylogowany?
Skoro sesja nadal jest aktywna to niech aktualizuje czas, a nie wylogowywuje go.
Dominator
No to napisz skrypt, że może być zalogowanym tylko przez 3600 sekund, gdy wartość jest większa to automatycznie przenosi do strony, gdzie ma nastąpić wylogowanie.

A potem w jQuery możesz to sprawdzać.
Niktoś
A nie wystarczy użyć metody Session.autoRegenerate?Jeśli użytkownik nie będzie aktywny to sesja sama wygaśnie po tym można zrobić autowylogowanie.Jeśli użytkownik bedzie aktywny to sesja nie ulegnie przedawnieniu.
Dominator
Cytat(Niktoś @ 30.06.2012, 22:36:35 ) *
A nie wystarczy użyć metody Session.autoRegenerate?Jeśli użytkownik nie będzie aktywny to sesja sama wygaśnie po tym można zrobić autowylogowanie.Jeśli użytkownik bedzie aktywny to sesja nie ulegnie przedawnieniu.


Ale tutaj się wiąże użycie klasy CakePHP. A pewnie kolega wolałby coś własnego wykombinować snitch.gif
Maxie
Session.autoRegenerate ? O co w tym chodzi, znaczy się jak to wykorzystać?
Dominator
Cytat(Maxie @ 30.06.2012, 22:49:13 ) *
Session.autoRegenerate ? O co w tym chodzi, znaczy się jak to wykorzystać?


Session.autoRegenerate jest częścią frameworka CakePHP.
Maxie
Myślę, że można by zrobić "migawkę" w javascripcie, która reloadowała by się co 5 sec przy czym by zmieniała w bazie offline / online jeżeli by było inaczej rzecz jasna, ale by było to zasobożerne, co o tym uważacie?
CTRL
Myślimy o tym to, żebyś robił to nie co 5 sekund tylko co minutę. Albo więcej.
Dominator
Zrób stronę, która sprawdza czy od zalogowania nie minęło więcej niż 3600 sekund. Jeśli minęło to wylogowuje, a jeśli nie to po prostu pozostaje na stronie. Następnie w javascripcie przez funkcję setInterval sprawdzaj co 5000MS ową stronę.
Maxie
A w tym przypadku, gdy ktoś będzie oglądał dłużej daną podstronę to wywali ;/ a nie chcę tak, chcę mieć rzetelną informację, czy ktoś jest w przeglądarce, na mojej stronie z włączoną sesją ;p
Niktoś
Cytat
Session.autoRegenerate jest częścią frameworka CakePHP

Dziwne, że tylko tam -opcja bardzo przydatna szczególnie w takich przypadkach.
modern-web
Pomysły macie w sam raz ale pozwólcie, że podzielę się swoim smile.gif
Nie możesz zapisywać tylko wartości 0/1 w zależności od statusu, bo co jeśli zamknę przeglądarkę...? będę nadal dostępny.
Najlepszym sposobem - skorzystaj z bazy danych (pliki odpadają z uwagi na szybkość zapisu i dostęp do danych), struktura: id|usr|time, id - A.I., usr - nick zalogowanego, time = wartość funkcji time().
Ok, masz już wszystko gotowe smile.gif za każdym razem uruchamiaj taką funkcję (napisz ją sobie na podstawie tego co powiedziałem) i zapisuj WSZYSTKIE odświeżenia zalogowanych.
Jeśli chodzi o wyświetlanie listy - zwykłe zapytanie z GROUP BY `usr` smile.gif
Aby nie zaśmiecać bazy ustaw również w początkowej funkcji odnajdowanie i usuwanie wyników nie spełniających kryteriów - np. ty chcesz jedynie ostatnie 5min, a w bazie masz także zapisy z ostatnich kilku godzin. smile.gif
Polecam również skorzystanie z zapytania TRUNCATE, chyba, że lubisz mieć id o długości 20 znaków po kilku dniach wink.gif

Pozdrawiam,
pytaj jak czegoś nie wiesz smile.gif
Giluś
Kiedyś ktoś mi polecił takie rozwiązanie:

  1. $userid = $_SESSION['user'];
  2. $czas_teraz = mktime();
  3. if ($_SESSION['zalogowany'] + 60 < $czas_teraz) {
  4. mysql_query("UPDATE dragonball_gracze SET zalogowany='".$czas_teraz."' WHERE gracz='".$user."'") or die (mysql_error());
  5. $czas_wczesniej = $czas_teraz - 60;
  6. $q1 = mysql_query("SELECT gracz FROM dragonball_gracze WHERE zalogowany>='".$czas_wczesniej."'") or die (mysql_error());
  7. $_SESSION['zalogowanych'] = mysql_num_rows($q1);
  8. $_SESSION['zalogowany'] = $czas_teraz;
  9. }


Ale nie miałem szansy tego przetestować na dużą skale, (ten kod trzeba dać do każdego pliku).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.