Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Sprawdzanie trwających połączeń / sesji, Nie wiem jak to zatytułować.
sadistic_son
post 2.09.2010, 18:58:45
Post #1





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


Witam,

Piszę aktualnie prostą gierkę on-line.
Kiedy użytkownik poda swoje imie do bazy zostaje dodanych kilka rekordow z przydatnymi pozniej danymi.
W momencie ukonczenia/przejscia gry przez uzytkownika rekordy te sa usuwane.
Jak zrobic aby te rekordy usunaely sie nawet w przypadku kiedy user zamknie przegladarke lub pojdzie na inna strone?
Wymyslilem ze najprosciej bedzie jak skrypt bedzie sprawdzal jakie sesje sa aktywne. Czyli np. user 'adam' wlasnie gra i jego sesja ($_SESSION[name']='adam')jest aktywna wiec jego rekordy nie moga jeszcze zostac usuniete z bazy.
Natomiast user 'jurek' opuscil strone przed ukonczeniem gry. Zakladam ze tym samym jego sesja ($_SESSION['name']='jurek' ) przestala byc aktywna. W takim wypadku jego rekordy powinny zostac usiniete.
Jak to zrobic? Jak sprawdzic jakie wartosci przyjmuje $_SESSION['name'] w tym samym czasie dla roznych uzytkownikow? Jest to w ogole mozliwe?

Ten post edytował sadistic_son 2.09.2010, 18:59:39


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
krispak
post 2.09.2010, 19:06:24
Post #2





Grupa: Zarejestrowani
Postów: 250
Pomógł: 55
Dołączył: 27.08.2008

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


Do kazdego $_SESSION['name'] dopisz jeszcze np $_SESSION['timeUser']. Przy podaniu przez uzytkownika imienia automatycznie dodawany jest tez aktualny czas i teraz przy kazdej aktywnosci uzytkownika ten czas jest nadpisywany na aktualny czyli uzytkownik caly czas jest, dopisz fukcje sprawdzajaca czy np aktualny czas danego uzytkownika nie jest np starszy wiecej niz 5 minut od aktualnego czasu, jezeli nie tzn uzytkownik jest jezeli jest starszy tzn ze uzytkownika nie ma wiec wszystkie rekordy ze starsza data usuwasz

Ten post edytował krispak 2.09.2010, 19:11:15


--------------------
* * * * * * * * * * * * * * * * * * * * * * * * *
PHP, Laravel, Docker, Docker Compose, Laradock, Redis, JS, React, Vue, CSS, SCSS, Gulp, GIT ... itd..
Go to the top of the page
+Quote Post
thomson89
post 2.09.2010, 19:09:38
Post #3





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

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


A jakbyś przy ukończeniu gry przez użytkownika, kasował rekordy i DODAWAŁ do tabelki 'przeszli' np. coś takiego:
Kod
id -- przeszedl
1-----0 lub 1


I przy kolejnym uruchomieniu skryptu przez tego usera sprawdzisz czy przeszedł, a jak nie to usuniesz rekordy.

Przy takiej tabelce, możesz też wywoływać zadania (cron) i czyścić bazę co, np. ~2h

--EDIT:
~krispak - on nie ma dostępu do sesji użytkownika którego nie ma na stronie skryptu lub który wyczyścił sesje (wyszedł / zamknął przeglądarkę).

Ten post edytował thomson89 2.09.2010, 19:11:33


--------------------
Sklep 70%
Go to the top of the page
+Quote Post
sadistic_son
post 2.09.2010, 19:40:57
Post #4





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


Rzecz w tym, że partia gry może trwać nawet i kilka dni, więc dodanie licznika czasu jaki proponował krispak odpada. Pomysł thomson89 też nie rozwiązuje problemu bo nie mam systemu logowania. Każda trwająca gra opiera się jedynie na istniejącej w danym momencie sesji. Jaśli user się odłączy (zamknie przeglądarke czy coś) to po ponownym rozpoczęciu gry traktowany będzie jako nowo-zaczynający gracz. To musi się opierać na rozpoznawaniu sesji w jakimś panelu administracyjnym. Tak więc ponawiam swoje pytanie:
Cytat(sadistic_son @ 2.09.2010, 19:58:45 ) *
Jak sprawdzic jakie wartosci przyjmuje $_SESSION['name'] w tym samym czasie dla roznych uzytkownikow? Jest to w ogole mozliwe?



--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
thomson89
post 2.09.2010, 19:51:10
Post #5





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

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


Skoro nie masz autoryzacji, możesz jako id potraktować IP gracza.


--------------------
Sklep 70%
Go to the top of the page
+Quote Post
bastard13
post 2.09.2010, 20:16:59
Post #6





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

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


Cytat
Jak sprawdzic jakie wartosci przyjmuje $_SESSION['name'] w tym samym czasie dla roznych uzytkownikow? Jest to w ogole mozliwe?

Nie sprawdzisz tego. Każda sesja jest indywidualna dla każdego użytkownika, ponieważ, gdybyś miał do nich dostęp to wyobraź sobie co by się stało, gdyby ktoś niepożądany zdobył takie same uprawnienia:)
Więc albo cron albo możesz na przykład przy każdym użytkowniku (w bazie) dopisywać datę i godzinę ostatniego pojawienia się. Na przykład w sesji trzymasz godzinę odświeżenia strony i przy każdym przechodzeniu na podstrony, czy wykonywaniu innych czynności na stronie (jak gra to na pewno jakaś interakcja z serwerem jest:) sprawdzać godzinę i jeżeli np. czas aktualny - czas z sesji < 10 minut, to wtedy aktualizuj bazę (ostatnie pojawienie się) i godzinę w sesji.
Dodatkowo stwórz sobie tabelę z kolumną np. ostatnie_czyszczenie. Załóżmy czyszczenie co pół godziny.
Gracz sobie gra i mija 13:30, więc pobiera datę ostatniego_czyszczenia.
Jeżeli jest ona mniejsza niż 13:30 to wtedy skrypt przechodzi przez tablicę z użytkownikami i dla tych, których ostatnie_pojawienie>10 minut, usuwa ich rekordy (te, które chcesz usunąć). Po tej czynności aktualizuje ostatnie_czyszczenie na aktualny czas.
Jeżeli wartość będzie większa to nie robi nic.
I tak co pół godziny będziesz miał usuwane niechciane rekordy.
Minus: raz na pół godziny jednemu użytkownikowi trochę dłużej będzie się wczytywała strona.
Na pocieszenie dodam, że jeżeli mało graczy, to mała baza, więc wcale tak długo to nie potrwa, a jeżeli dużo graczy, to niewielkie szanse, że coś takiego przytrafi się temu samemu graczowi zbyt często:)


--------------------
Go to the top of the page
+Quote Post
krispak
post 2.09.2010, 21:20:45
Post #7





Grupa: Zarejestrowani
Postów: 250
Pomógł: 55
Dołączył: 27.08.2008

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


@bastard13 cos podobnego juz zaproponowalem:) ale autor stwierdzil ze nie smile.gif

@Edit: @thomson89 Zle sie w poprzednim poscie wyrazilem - chodzilo mi ze dany czas (unixowy) uzytkownika nadpisywany jest do bazy a w funkcji sobie sprawdza czy dane czasy sa starsze od swojej okreslonej i na tej podstwie moze weryfikowac czy ktos jest czy kogos nie ma.


Cytat
Rzecz w tym, że partia gry może trwać nawet i kilka dni...

Ok, wiec co robisz w przypadku gdy uzytkownik stwierdza ze na dzisiaj koniec i zagra jutro? Wymogiem jest ukonczenie poziomu czy cos podobnego?

Ten post edytował krispak 2.09.2010, 22:18:24


--------------------
* * * * * * * * * * * * * * * * * * * * * * * * *
PHP, Laravel, Docker, Docker Compose, Laradock, Redis, JS, React, Vue, CSS, SCSS, Gulp, GIT ... itd..
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: 18.06.2025 - 11:01