Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony]Aktualnie zalogowani użytkownicy.
Valantir
post 9.12.2011, 13:24:47
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 7
Dołączył: 6.09.2011
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Witam, chciałbym zrobić moduł, który wyświetli mi listę zalogowanych użytkowników. (coś w stylu jak znajomi na facebooku czy nk). Zapisuję sesje do bazy danych:
Kod
storage:
    class: sfPDOSessionStorageOverride
    param:
      session_name: pracainz
      db_table:     session
      database:     propel
      db_id_col:    session_id
      db_data_col:  session_value
      db_time_col:  session_time


Nadpisałem metodę sessionWrite klasy sfPDOSessionStorage:

Kod
class sfPDOSessionStorageOverride extends sfPDOSessionStorage
{
    public function sessionWrite($id, $data)
    {
        // get table/column
        $db_table = $this->options['db_table'];
        $db_data_col = $this->options['db_data_col'];
        $db_id_col = $this->options['db_id_col'];
        $db_time_col = $this->options['db_time_col'];

        $db_user_id_col = 'user_id';
        $user = sfContext::getInstance()->getUser();
        $user_id = false;
        if ($user->isAuthenticated())
        {
            $user_id = $user->getGuardUser()->getId();
        }

        if ($user_id && ($user_id>0))
        {
            $sql = 'UPDATE '.$db_table.' SET '.$db_user_id_col.'= ?, '.$db_data_col.' = ?, '.$db_time_col.' = '.time().' WHERE '.$db_id_col.'= ?';
            try
            {
                $stmt = $this->db->prepare($sql);
                $stmt->bindParam(1, $user_id, PDO::PARAM_STR);
                $stmt->bindParam(2, $data, PDO::PARAM_STR);
                $stmt->bindParam(3, $id, PDO::PARAM_STR);
                $stmt->execute();
            }
            catch (PDOException $e)
            {
                throw new sfDatabaseException(sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage()));
            }

        }
        else
        {
            $sql = 'UPDATE '.$db_table.' SET '.$db_data_col.' = ?, '.$db_time_col.' = '.time().' WHERE '.$db_id_col.'= ?';
            try
            {
                $stmt = $this->db->prepare($sql);
                $stmt->bindParam(1, $data, PDO::PARAM_STR);
                $stmt->bindParam(2, $id, PDO::PARAM_STR);
                $stmt->execute();
            }
            catch (PDOException $e)
            {
                throw new sfDatabaseException(sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage()));
            }

        }

        return true;
    }
}

Dodałem kolumnę, która będzie przy sesji wpisywać id użytkownika, który się zalogował ale jest inny problem...
Otóż przy otwarciu strony z formularzem logowania sfGuardPlugin do bazy dodawany jest rekord. Np taki:
Cytat
8nnope4knm9l56p1brabjvt5c3 symfony/user/sfUser/lastRequest|i:1323421511;symfo... 1323421512 0

Następnie przy faktycznym zalogowaniu użytkownika na stronę tworzony jest kolejny rekord:
Cytat
epervhmgatp2t45rpc383u24j7 symfony/user/sfUser/lastRequest|i:1323421619;symfo... 1323421620 1

No i przy wylogowaniu jeszcze jeden rekord jest wstawiany do bazy:
Cytat
1rq7q4g4vb94doodenr7k45rc4 symfony/user/sfUser/lastRequest|i:1323421654;symfo... 1323421654 0

No i teraz pytanie. Jak zgrać to wszystko aby po wylogowaniu rekord danego użytkownika został skasowany a nie wpisywany nowy?


--------------------
Pomogłem? Kliknij "Pomógł".
Go to the top of the page
+Quote Post
adbacz
post 9.12.2011, 15:54:38
Post #2





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


A nie możesz zwiększyć czasu przechowywania sesji? Robią się nowe rekordy w DB bo prawdopodobnie, podczas kolejnego requestu, ostatnia sesja już wygasła i SF odnawia sesję uaktualniając COOKIE gdzie przechowywany jest ID sesji. Możesz na przykład każdemu zalogowanemu userowi przypisać ciastko z jakimś ID generowanym podczas logowania. W bazie dodać nową kolumnę w tabeli użytkowników, i przechowywac tam czas kiedy został user zalogowany, czy został zapamiętany, i jego ID z ciastka. Później podczas sprawdzania ilu jest aktuwnych userów, szukasz tylko takich, którzy mają określone dane w kolumnie.

Powiedzmy, że zapamiętanie sesji to 24 godziny, więc sprawdzasz, który user ma liczbę większą od time() - 24godz. (czas w tabeli zapisywany też funkcją time()), i jesli jest więszky (czyli zalogował się conamniej 24 godziny temu) to znaczy, że nadal jest aktywny.

Dodatkowo, jeśli user się wyloguje przed wygaśnięciem sesji, uaktualniasz jego czas w tabeli na 0.
Go to the top of the page
+Quote Post
Valantir
post 10.12.2011, 12:12:44
Post #3





Grupa: Zarejestrowani
Postów: 93
Pomógł: 7
Dołączył: 6.09.2011
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Chodzi o to, że podczas aktywności po zalogowaniu drugi wpis się aktualizuje. Jeżeli chodzi o ciastka, to nie pracowałem z nimi pod symfony... Tzn nie ogarniałem jeszcze tego tematu, a bardzo mi się spieszy, bo to praca inżtongue.gif Próbowałem podczas logowania dodać do tabeli rekord z id użytkownika, a podczas wylogowywania usuwać ten rekord ale nie wiem jak pobrać w metodach signin (na końcu metody, bo nie wiem gdzie dokładnie jest tworzona sesja w tej metodzie) i signout (na początku metody zanim sesja wygaśnie) id zalogowanego użytkownika. Gdybym miał id zalogowanego użytkownika w tych metodach, to wstawiłbym do bazy może jakoś to id i wtedy wyciągał z łatwością. A ten czas w którym miejscu miałbym zwiększyć? Nie ogarniam tego tematu...

Ten post edytował Valantir 10.12.2011, 12:14:02


--------------------
Pomogłem? Kliknij "Pomógł".
Go to the top of the page
+Quote Post
adbacz
post 10.12.2011, 17:18:45
Post #4





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Praca inżynierska, tak? No to fajnie wink.gif Czas wygaśnięcia sesii przechowywany jest w app/config/config.yml pod nazwą session.lifetime zamiast tego co jest, zwiększ do ilu tam sobie chcesz. Najlepiej do 24 godzin.

Nie ogarniasz tematu z ciastkami? A co to za problem wejść na php.net i przczytać o dwóch funkcjach, jedna tworzy a druga usuwa ciacho?

A tak na marginesie, to masz napisany własny system logowania, używasz systemu Symfony czy może jakiegoś innego?

PS. Gdybyś dobrze pomyślał, to szybciej napisałbyś to co ja naskrobałem w moim pierwszym poście, niż rozmowa tutaj teraz o tym.
Go to the top of the page
+Quote Post
Valantir
post 10.12.2011, 18:52:06
Post #5





Grupa: Zarejestrowani
Postów: 93
Pomógł: 7
Dołączył: 6.09.2011
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Wiesz, gdy nie ma się z czymś do czynienia, to zawsze wydaje się to trudne do póki się na to nie spojrzy "spokojnym" okiem:) Używam sfGuardPlugin'u do logowania. Jutro jeszcze pomyślę nad tym wszystkim na spokojnie:)


--------------------
Pomogłem? Kliknij "Pomógł".
Go to the top of the page
+Quote Post
adbacz
post 10.12.2011, 19:17:14
Post #6





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Poszukaj w kodzie, kiedy i w jakim miejscu są odpytywane konkretne metody w tym pluginie. Tak najszybciej dojdziesz do tego, gdzie, kiedy i która metoda co robi. W Twoim przypadku musisz znaleźć metodę, która generuje to zapytanie do bazy i sie pod nią podpiąć jakoś. Możesz też poszukać metody, która jest przez tą wysyłającą dane do bazy, i z niej jakoś wyciągać dane o zalogowanym userze. Z resztą o czymś takim już wspominałeś.

Gdzie chcesz dodać ten rekord użytkownika o którym tutaj mowa, w jakiej tabeli:
Cytat
Próbowałem podczas logowania dodać do tabeli rekord z id użytkownika, a podczas wylogowywania usuwać ten rekord


Wg mnie, nalepszym rozwiązaniem, będą ciastka i dodatkowa kolumna w tabeli użytkowników. W tedy, nie będziesz musiał się bawić w szukanie po kodzie tego pluginu, tylko dopiszesz sobie mała klasę, i podepniesz ją pod logowanie i wylogowywanie. Ale to tylko moje zdanie. Szkoda, że nikt inny się nie wypowiedział na ten temat, może jakiś świeży pomysł by padł...
Go to the top of the page
+Quote Post
Valantir
post 11.12.2011, 11:01:43
Post #7





Grupa: Zarejestrowani
Postów: 93
Pomógł: 7
Dołączył: 6.09.2011
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Gdzie chciałem dodać? Nie wiem-stworzyć sobie tabelę Aktywni czy coś w tym stylu... No właśnie dzisiaj będę szukał takiego miejsca w tych metodach. I pokombinuję też chyba z tymi ciastkami:) No szkoda, że nikt inny się nie wypowiada, bo chyba to jest dość powszechny problem...?


--------------------
Pomogłem? Kliknij "Pomógł".
Go to the top of the page
+Quote Post
adbacz
post 12.12.2011, 11:31:06
Post #8





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Nie wiem czy taki powszechny. Ja nigdy się z podobnym tematem na forum tutaj, ani nigdzie indziej nie spotkałem. Aczkolwiek sądzę, że to mało przydatna rzecz, jesli pisze się coś, co nie ma nic związanego ze społecznościówką, że się tak wyrażę. Bo jakoś dziwnie sobie wyobrazić portal społecznościowy, który nie udostepnia takiej opcji, lub forum (jak te PHP). Aczkolwiek, jesli ktoś pisze swój system logowania, to bez problemu, nawet nie zastanawiając się zbytnio, napisze to, o czym mowa w temacie, w mgnieniu oka - nie jest to trudne. Gorzej właśnie, jak trzeba to rozwiązać a ma się do czynienia z czymś skryptem, w tedy bez dokumentacji, albo czytania kodu się nie obejdzie niestety.

Pozdrawiam...

PS. Nie opłaca się tworzyć nowej tabeli. Za duże marnotrastwo.

Ten post edytował adbacz 12.12.2011, 11:32:05
Go to the top of the page
+Quote Post
Valantir
post 29.12.2011, 18:29:35
Post #9





Grupa: Zarejestrowani
Postów: 93
Pomógł: 7
Dołączył: 6.09.2011
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Znalazłem fragment kodu, w którym mogę się podpiąć i wstawić dane do bazy. Wielkie dzięki ogólny zarys jak można rozwiązać ten problem i pomoc bez tekstów typu - "czego ty *** nie rozumiesz w tym problemie?" i odsyłania do 30 linków:)tongue.gif
Pozdrawiam i jeszcze raz dzięki

To znowu ja:D piszę w tym temacie, bo tego dotyczy moje pytanie. Jak pobrać opcję session.lifetime?


--------------------
Pomogłem? Kliknij "Pomógł".
Go to the top of the page
+Quote Post
adbacz
post 29.12.2011, 23:15:28
Post #10





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


A sprawdzałeś, czy klasa zarządzająca sesją (PDOSessionStorage lub inna) nie przetrzymuje tego czasem w swojej właściwości jakiejś? A tak na marginesie - po co Ci to wyciągać?
Go to the top of the page
+Quote Post
Valantir
post 30.12.2011, 12:21:27
Post #11





Grupa: Zarejestrowani
Postów: 93
Pomógł: 7
Dołączył: 6.09.2011
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Bo zrobiłem to trochę inaczej... W każdym bądź razie potrzebne jest mi to, gdyż czas ten wykorzystuje w jednym fragmencie kodu, a nie chcę mieć wpisanego tego na sztywno.


--------------------
Pomogłem? Kliknij "Pomógł".
Go to the top of the page
+Quote Post
adbacz
post 2.01.2012, 16:11:32
Post #12





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


No dobra, to było akurat proste i może troszkę na okrągło, ale masz. SF dysponuje możliwością korzystania z plików YML, a więc musi posiadać parser tych plików. A że plik config.yml jest napisany właśnie w YAML to możemy użyć symfonowych bibliotek. Użycie na pliku config.yml:
  1. namespace Twojprojekt
  2.  
  3. use Symfony\Component\Yaml\Yaml;
  4.  
  5. class Klasa {
  6.  
  7. public function pokazConfigAction() {
  8. $array = Yaml::parse('/path/to/app/config/config.yml');
  9. //Pokaże całą tablicę z zawartością pliku config.yml
  10. var_dump($array);
  11. //Dostęp do lifetime sesji
  12. $sessLifetime = $array['framework']['session']['lifetime'];
  13. }
  14. }


Mam nadzieję, że Ci pomogłem. Niestety, nie znalazłem innego rozwiązania (o którym pisałem wcześniej, o klasie która zarządza sesją) to podałem CI najprostsze, jakie udało mi się wymyślić, znaleźć. Powodzenia...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.05.2024 - 13:26