Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]sprawdzanie czy user online
Forum PHP.pl > Forum > PHP > Frameworki
AxZx
witam

jak konkretnie zrealizowac sprawdzanie czy dany uzytkownik jest online?
sesje zapisywane mam w bazie mysql, w sesji zapisuje ID uzytkownika po zalogowaniu.
mam teraz sprawdzac wykonac zapytanie
  1. SELECT * FROM sessions WHERE sess_data LIKE '%iduser";i:54'

?
LBO
Dla mnie czas ostatniej akcji nie jest częścią danych do zapisania w sesji, tylko normalnych danych o użytkowniku. Nie widzę powodu, żebyś się tak męczył.


edit: doczytałem dokładnie Twojego posta i w sumie nie wiem o co Tobie chodzi. Skoro w sesji masz tylko id usera, to znaczy, że to o czym pisałem wyżej jest poprawne. Po co tobie wyszukiwać to id w danych sesji?
AxZx
zagadnienie jest znane w duzej ilosci serwisach spolecznosciowych.
obok informacji o profilu jest info czy jest w danej chwili zalogowany czy nie.

temat byl juz poruszany na forum i z tego co pamietam to wlasnie robi sie to korzystajac z mechanizmu sesji w bazie danych.
LBO
hę? Ja wiem o co chodzi, ale to wydaje mi się błędnym rozwiązaniem. Sypnij linkiem jakbyś mógł do Twojego sposobu.

A co powiesz na dodatkową kolumnę w tabeli użytkowników z czasem ostatniej akcji? Czyż nie byłoby łatwiej?
AxZx
owszem, latwiej by bylo bo podczas logowania robie update na tabeli profil i juz. ale co jak user zamknie przegladarke?
trzeba by dodatkowe modyfikacje wprowadzac. nie wiem jak to robi klasa mysqlstoragesession - ale ona chyba automatycznie usuwa stare wiersze. chyba ze nie, wtedy to rozwiazanie tez nie jest za dobre;)

wlasnie po to zalozylem ten temat zeby dowiedziec jak to zrealizowac w symfony.
LBO
Czekaj, czekaj - wróćmy do teorii. Byłem pewien, że nie można wykryć zamknięcia przeglądarki w PHP - ewentualnie w skryptach po stronie usera (ale to może być i JEST zawodne).
Moim zdaniem najlepiej się trzymać metody z dodatkową kolumną i czasem nieaktywności po którym użytkownik jest uznawany jako offline.
SirZooro
Zamknięcia przeglądarki nie da się wykryć, no chyba żeby podpiąć jakiegoś AJAXa pod zdarzenie onunload na stronie (nie sprawdzałem tego). Poza tym są jeszcze osoby które mają wyłączony JS, albo po prostu zostawią włączoną przeglądarkę np. na noc - na nich nic nie poradzisz. Osobiście proponuję uznać osobę za zalogowaną jeżeli wykonała jakąś akcję w ciągu ostatnich np. 10 minut, i dodatkowo jeszcze uwzględniać czy osoba się nie wylogowała.
LBO
Nie używam Symfony, ale sprawdziłem jak działa ten adapter na bazę MySQL. Nie robi nic ciekawego niż zapisywanie czystych danych sesyjnych do bazy - nic więcej.

Mógłbyś opisać sposób do którego dążysz?

edit:

Cytat(SirZooro @ 17.08.2008, 14:49:28 ) *
Zamknięcia przeglądarki nie da się wykryć, no chyba żeby podpiąć jakiegoś AJAXa pod zdarzenie onunload na stronie (nie sprawdzałem tego). Poza tym są jeszcze osoby które mają wyłączony JS, albo po prostu zostawią włączoną przeglądarkę np. na noc - na nich nic nie poradzisz. Osobiście proponuję uznać osobę za zalogowaną jeżeli wykonała jakąś akcję w ciągu ostatnich np. 10 minut, i dodatkowo jeszcze uwzględniać czy osoba się nie wylogowała.


A o czym ja pisałem przez ostatnie kilka postów?
AxZx
z ta kolumna to troche komplikuje - bo trzeba by aktualizowac w niej ta date ktora zostanie zapisane podczas logowania.
bo jak zrobie taki bajer w symfony ze sesja nigdy nie wygasa to co wtedy?
wiec moj sposob z pierwszego posta tez jest zly bo bylo by ze caly czas jest online.

czyli jak to rozwiazac, ale juz konkretnie prosze:)

EDIT:
no to olac sesje w bazie. to jak to inaczej zrobic?
w kolumnie ostatnia_akcja w tabeli profil zapisywac date. ale kiedy? tylko podczas logowania to chyba za malo.
LBO
Przy każdym requeście zalogowanego użytkownika. Zwyczajnie dorób sobie to w sessionUser
AxZx
aha, czyli jedno zapytanie wiecej. ale jedno mniej bo sesje wracaja do plikow:)
LBO
Dokładnie smile.gif

Mam nadzieję, że --> POMOGŁEM <-- smile.gif
AxZx
tak, dziękuję bardzo.

a teraz pytanie już o samo Symfony

mam
  1. <?php
  2. class customActions extends sfActions{}
  3. ?>


w konstruktorze chce sprawdzyc czy user jest zalogowany i jezeli tak to wykonac zapytanie aktualizujace date w kolumnie ostatnia_akcja.

jak mam wykonac takie cos:
  1. <?php
  2. $this->getUser()->isAuthenticated()
  3. ?>

wyrzuca blad:
Call to a member function isAuthenticated() on a non-object.

jak mam to inaczej zrobic? zeby osiagnac to co LBO radzi.
LBO
Nie tu - zrób swojego sfUser i daj to w metodzie initialize()

edit: w konstruktorze nie ma jeszcze obiektu user - jest on dodawany już po tym (pewnie w metodzie initialize <albo startup, lub coś w ten deseń> - bazuje na podobieństwach z Agavi).
AxZx
dzieki, nie wiedzialem o tym initialize:)

a wracajac do tematu online/offline to to bedzie malo dokladne.
w tej metodzie initialize bedzie aktualizowana za kazdym razem data w kolumnie ostatnia_akcja. wiec jak user kliknie wyloguj i zamknie przegladarke to juz co? data bedzie zapisana ta w ktorej wykonal akcje wyloguj.
a na jego profilu bedzie dalej info ze jest zalogowany bo przyjalem ze 5 minut od daty z kolumny ostatnia_akcja.

jak to z tym jest? dobrze mysle czy jakis sposob jest? moze wyzerowac kolumne ostatnia_akcja podczas akcji wylogowanie i sprawdzac czy nie jest pusta - jak jest pusta to znak ze offline.
LBO
Ja user zamknął przeglądarkę to nie sprawdzisz tego - niestety. Możesz to sprawdzić z przybliżoną dokładnością.

Co do implementacji:
  1. <?php
  2. class MyUser extends sfBasicSecurityUser
  3. public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())
  4. {
  5. parent::initialize($dispatcher, $storage, $options); // pamietaj o tym
  6. if ($this->isAuthenticated()) {
  7.  // zapisujesz do bazy czas time()
  8. }
  9. }
  10. }
  11. ?>


Nie wiem jak to dokładnie działa w Symfony, jeżeli generuje ona sama klasę sessionUsera to znajdź ją i dopisz to co napisałem.
AxZx
dokladnie tak zrobilem:)
mysle ze 3 minuty wystarczy. zreszta kto na to patrzy:)

dziekuje bardzo. juz chyba wystarczy Ci 3 razy pomogl?smile.gif
LBO
Cytat(AxZx @ 17.08.2008, 15:59:46 ) *
a wracajac do tematu online/offline to to bedzie malo dokladne.
w tej metodzie initialize bedzie aktualizowana za kazdym razem data w kolumnie ostatnia_akcja. wiec jak user kliknie wyloguj i zamknie przegladarke to juz co? data bedzie zapisana ta w ktorej wykonal akcje wyloguj.
a na jego profilu bedzie dalej info ze jest zalogowany bo przyjalem ze 5 minut od daty z kolumny ostatnia_akcja.


Tak, ale przy wylogowaniu możesz ustawić ten czas na 5 minut wstecz, ale nie przejmowałbym się tym zwyczajnie - skoro i tak wszystko jest w przybliżeniu.

Cytat(AxZx @ 17.08.2008, 15:59:46 ) *
jak to z tym jest? dobrze mysle czy jakis sposob jest? moze wyzerowac kolumne ostatnia_akcja podczas akcji wylogowanie i sprawdzac czy nie jest pusta - jak jest pusta to znak ze offline.


Pamiętaj, że nie zawsze użytkownik się wylogowywuje, więc patrz wyżej.

Cytat(AxZx @ 17.08.2008, 16:15:09 ) *
dziekuje bardzo. juz chyba wystarczy Ci 3 razy pomogl?smile.gif


Czy ja wiem, nie zaszkodzi smile.gif

Pozdrawiam, Alan
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.