Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sprawdzanie trwających połączeń / sesji
Forum PHP.pl > Forum > Przedszkole
sadistic_son
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?
krispak
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
thomson89
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ę).
sadistic_son
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?

thomson89
Skoro nie masz autoryzacji, możesz jako id potraktować IP gracza.
bastard13
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:)
krispak
@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?
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.