Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kto jest online, jaki algorytm
Forum PHP.pl > Forum > PHP
Avatarus
Witam
Jak najbardziej optymalnie zrobić moduł do pokazywania kto jest online z zalogowanych userów?
Mam skrypt logowania. Tylko nie wiem zbytnio jak zapisać w nim dane o tym czy user jest online czy nie.

Jak się to robi profesjonalnie i w miarę optymalnie żeby bazy nie zabić duża ilością zapytań.

Dzięki
flashdev
Jak już masz bazę danych z userami i tylko ich chcesz podliczać, to dodaj do bazy komórkę TIMESTAMP, która będzie się update`owana aktualnym czasem przy każdych odwiedzinach usera.
Następnie przyjmujesz orientacyjnie średni czas przez jaki user jest na stronie np. 5 min i w miejscu gdzie chcesz wyświetlić licznik wyciągasz z bazy danych wszystkich userów, którzy byli w ciągu tych ostatnich przykładowych pięciu minut.
Avatarus
no tak myślałem o tym ale to by wymagało robienia tego updata za każdą najprostszą akcją na stronie.
Nie ma innej opcji?
flashdev
Cytat(Avatarus @ 15.08.2010, 17:13:18 ) *
no tak myślałem o tym ale to by wymagało robienia tego updata za każdą najprostszą akcją na stronie.
Nie ma innej opcji?


Powiedz najpierw w czym chcesz lepszą opcję, bo ja znam gorszą (bardziej obciąża serwer), ale może Tobie bardziej się spodoba, bo działa dokładniej.

Chodzi o to, że możesz dorzucić do strony skrypt, który przy pomocy ajaxa co minutę lub częściej będzie dawał o sobie znać, że user jeszcze jest na stronie. Będziesz miał dokładniejsze wyniki, jeśli o to chodzi?
darophp
Ja pisałem kiedyś takie coś i mam zrobione tak:
- osobną tabelę "zalogowani"
  1. CREATE TABLE `zalogowani` (
  2. `login` varchar(50) NOT NULL,
  3. `data` datetime NOT NULL,
  4. PRIMARY KEY (`login`)
  5. )

- oczywiście łączenie i do sesji zapisuje login użytkownika
- następnie zapytanie i wstawiam użytkownika do tabeli
  1. $_SESSION['login']=$login;
  2. mysql_query("INSERT INTO zalogowani SET login='{$_SESSION['login']}', data=NOW()");

- tam gdzie ma być wylogowanie użytkownika, ten kod:
  1. mysql_query("DELETE FROM zalogowani WHERE login='{$_SESSION['login']}'");

- tam gdzie chcesz śledzić usera
  1. if ($_SESSION['login']) {
  2. mysql_query("REPLACE INTO zalogowani SET login='{$_SESSION['login']}', data=NOW()");
  3. }

- tam gdzie chcesz wyświetlić użytkowników
  1. mysql_query("DELETE FROM zalogowani WHERE data<DATE_SUB(NOW(),INTERVAL 15 MINUTE)");
  2. $wynik = mysql_query("SELECT * FROM zalogowani ORDER BY login");
  3. if ($wynik) {
  4. echo "Zalogowani użytkownicy: ";
  5. while($dane=mysql_fetch_assoc($wynik)) {
  6. if (++$i>1) echo ", ";
  7. echo "{$dane[login]}";
  8. }
  9. }
  10. }


No ... w sumie napisałem Ci wszytko, powinno działać smile.gif
Avatarus
no tak, juz zrobiłem zgodnie z 1 wskazówką.
Mam funkcję która odpala się zaraz po nagłówku strony i jeśli jest ustalone session[id] to w tabeli kont userów updatuje wartość pola online.
Dzięki za wskazówki
flashdev
Cytat(Avatarus @ 15.08.2010, 21:21:56 ) *
no tak, juz zrobiłem zgodnie z 1 wskazówką.
Mam funkcję która odpala się zaraz po nagłówku strony i jeśli jest ustalone session[id] to w tabeli kont userów updatuje wartość pola online.
Dzięki za wskazówki


Pewnie dalej czujesz niedosyt i szukasz czegoś takiego.
Po wywołaniu zdarzenia otworzyć nowe okno przegladarki, które powiadomi php/sql, że user wyszedł. No i nie trzeba będzie za każdym razem robić tego nieszczęsnego update`u bazy.
Niestety to nie zawsze zadziała. Przeglądarki blokują okienka, javascript nie wszędzie jest włączony. Nie można polegać na takich rozwiązaniach więc nie masz co szukać lepszego winksmiley.jpg
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.