![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 21.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Mam problem. Potrzebuje wykonać pewne operacje na bazie danych ale dopiero wtedy gdy użytkownik się wyloguje lub zostanie sam wylogowany automatycznie po timeout sesji. Jeżeli chodzi o tę pierwszą wersje to poradziłem sobie bez problemu. Niestety nie wiem jak wykryć, że dany użytkownik nie jest już aktywny i że wygasła sesja. Szukałem na różnych forach ale nie znalazłem niczego co pomogłoby mi rozwiązać problem. Proszę o pomoc, nakierowanie. Pozdrawiam |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Robisz sesje na BD, okresowo sprawdzasz tabelę sesii pod kątem czasu ostatniej aktywności. Jeśli czas nieaktywności > ustalony czas sesii robisz sobie coś z userem, i wywalasz rekord z BD.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 21.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
A nie ma takiej możlwiości żeby zrobić to z automatu, tak żeby nie sprawdzać samemu nieaktywności co jakiś czas ?
Jeżeli nie ma to czy można np. zrobić automat, który działa co jakiś określony czas? Ten post edytował Thompsoon 13.05.2015, 15:16:55 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
cron
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 21.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
To jedyne rozwiązanie? Dopiero zaczynam przygodę z php i nie wiem czy będe w stanie to ugryźć
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 150 Pomógł: 31 Dołączył: 10.01.2007 Skąd: Bydgoszcz/Inowrocław Ostrzeżenie: (0%) ![]() ![]() |
sesja na db - http://php.net/manual/en/function.session-...ave-handler.php
Zmiany w bazie przy usuwaniu rekordu sesji możesz wykonać przy pomocy triggerów before delete lub after delete. Za ich pomocą i sys_exec możesz wykonać nawet zewnętrzny skrypt/program bezpośrednio z mysql ![]()
//Edit: oczywiście zamiast sys_exec możesz wykonać jakiś SQL, informacje o starym rekordzie znajdują się w OLD Ten post edytował salfunglandyare 13.05.2015, 16:22:39 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 1 270 Pomógł: 184 Dołączył: 7.10.2012 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Zrob sobie przy uzytkowniku kolumne ostatni czas aktywnosci (oczywiscie aktywnosc musisz updatowac przy kazdym reloadzie), ustaw czas aktywnosci sesji np na 1 godzine jezeli uzytkownik ostatnia aktywnosc mial godzine temu to automatycznie sesja go wyloguje i bedziesz wiedziec ze jest nieaktywny rowniez w bazie danych.
Ten post edytował rad11 13.05.2015, 16:58:08 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 21.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
Zrob sobie przy uzytkowniku kolumne ostatni czas aktywnosci (oczywiscie aktywnosc musisz updatowac przy kazdym reloadzie), ustaw czas aktywnosci sesji np na 1 godzine jezeli uzytkownik w bazie ostatnia aktywnosc mial godzine temu to automatycznie sesja go wyloguje i bedziesz wiedziec ze jest nieaktywny. Ten sposób chyba jest najbliższy temu co mam teraz. Mam dwie kolumny: jedna pokazuje czy użytkownik jest aktywny a druga czas ostatniej aktywności. I to działa. Tylko jak sprawdzić automatycznie czy użytkownik nie był aktywny przez np. godz i wysłać polecenie o wykonaniu określonych operacji na bazie gdy nie był aktywny? |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 1 270 Pomógł: 184 Dołączył: 7.10.2012 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Musisz pobrac date ostatniej aktywnosci i porownac ja z aktualna. Jezeli roznica jest wieksza niz godzina tzn ze jest nieaktywny.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 21.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
No tak, tylko to musiał bym zrobić nową funkcje i uruchamiać ją manualnie.
Idea jest taka: 1. Loguje się użytkownik 2. Robi jakieś dziwne rzeczy powodujące wpisy w bazie 3. Kończy pracę: a. wylogowuję się -> odpalam funkcje, która czyści to czego nie potrzebuje - to zrobiłem b. nie wylogowuje się -> sesja się zamyka po jakimś czasie automatycznie - i tutaj potrzebuje zrobić coś żeby wykrywało zamknięcie sesji i wykonywało funkcje takie jak przy wylogowaniu Ten post edytował Thompsoon 13.05.2015, 17:18:07 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 1 270 Pomógł: 184 Dołączył: 7.10.2012 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
No to Ci tlumacze masz do tego ostatnia aktywnosc. Jezeli bedziesz mial ustawiona sesje na godzine to na tej podstawie sprawdzasz ostatnia aktywnosc. Tylko jezeli nie chcesz tego robic manualnie bo z tego to wynika to musisz albo wykonywac ajaxem jakies operacje co jakis czas albo cronem.
Ten post edytował rad11 13.05.2015, 17:22:06 |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 150 Pomógł: 31 Dołączył: 10.01.2007 Skąd: Bydgoszcz/Inowrocław Ostrzeżenie: (0%) ![]() ![]() |
Albo mimo wszystko sesja w db i trigger na before/after delete
![]() |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 1 270 Pomógł: 184 Dołączył: 7.10.2012 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Lepiej aby chlopak zaczal od latwiejszego sposobu wedlug mnie
![]() |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 21.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
Albo mimo wszystko sesja w db i trigger na before/after delete ![]() Czy w przypadku tego sposobu osiągnę to co zamierzam bez AJAXa i Crona? Jeżeli tak to spróbuje się w to zagłębić chociaż na pierwszy rzut oka może być ciężko. Manualne wykonywanie tej fukcji mnie niestety nie urządza. Operacje te muszą się wykonywać niemal niezwłocznie po zamknięciu sesji. |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 150 Pomógł: 31 Dołączył: 10.01.2007 Skąd: Bydgoszcz/Inowrocław Ostrzeżenie: (0%) ![]() ![]() |
Generalnie tak:
- sesja zapisywana w bazie przez mechanizm PHP, gdy sesja ma timeout, PHP co jakiś czas sam sprawdza i wywołuje metodę usuwania (teoretycznie budując własny handler w tym miejscu też możesz się wpiąć). Uswanie powoduje usunięcie rekordu z bazy - w bazie danych podczas usuniecia rekordu (lub rekordów) wywoływany jest trigger (before - przed usunieciem, after - po usunieciu), - trigger może uruchomić SQL lub skrypt. Problem jest w tym, aby dobrać się do wartości sesji, ale przy odrobinie wysiłku można dobrać się do wszystkich informacji, zawartość to zserializowana $_SESSION Wszystko z automatu ![]() Ten post edytował salfunglandyare 13.05.2015, 18:07:18 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 21.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
Ok czyli wiem jak to ma działać ale jak się za to zabrać?
Pomoże ktoś? Deklaruje od razu, że jak uda się napisać taki skrypt to wrzucę go do sekcji "gotowe rozwiązania" żeby służył też innym. Na początku musimy stworzyć bazę danych zapisujących sesje. Czy pola: Id, Timeout wystarczą? |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 150 Pomógł: 31 Dołączył: 10.01.2007 Skąd: Bydgoszcz/Inowrocław Ostrzeżenie: (0%) ![]() ![]() |
http://php.net/manual/en/function.session-...ave-handler.php - tu w pierwszym komentarzu masz w sumie gotowe rozwiązanie na sesję w bazie
![]() |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 21.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
Ok. Skopiuje do kodu swojej strony i zobaczę czy działa:)
Żartuje. Dzięki za pomoc. |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Skoro chcesz wykonać operacje po wylogowaniu i zakończeniu sesji to czy nie lepiej czyścić przed zalogowaniem? (O ile dane które są czyszczone nie są powiązane z niczym poza samym uzytkownikiem)
|
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 21.03.2015 Ostrzeżenie: (0%) ![]() ![]() |
Ale jeżeli ktoś się już nie zaloguje? Coś tam podłubie, niewyloguje się i zamknie przeglądarke
Chyba, że przed jakimolwiek zalogowaniem miałby sprawdzać czy czasy aktywnosci w bazie a nie w przypadku konkretnego usera. Rozwiązanie nieidealne ale zawsze coś. W międzyczasie przygotowałem kod. Tzn przerobiłem ten http://php.net/manual/en/function.session-...ave-handler.php
Ale chyba nie działa tak jakbym chciał. Zapisuje w polu 'Id' nazwę sesji, aktualizuje 'SessionExpires' w przypadku przeładowania strony ale w momenie gdy np. otworzę stronę na dwóch różnych przeglądarkach to mam tylko jeden wpis w bazie. Tak jakby się zastępował, a przecież gdy nie znajdzie 'Id' sesji to powienien tworzyć nowy. I widzę też że sesja nie usuwa się z bazy danych. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 08:35 |