Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z session_save_path po wyłączeniu przeglądarki nie znikają użytkownicy online
Forum PHP.pl > Forum > Przedszkole
poli25
Jak zrobić żeby po wyłączeniu przeglądarki znikały osoby online. Mam kod, w którym gość robi dokładnie to co ja i jemu się udaje a mi nie działa ;(
oto feralny kod:

session_start();
$session_path=session_save_path();
$visitors=0;
$handle=opendir($session_path);


while(($file=readdir($handle))!=FALSE)
{
if($file!="." && $file!="..")
{
if(ereg("^sess",$file))
$visitors++;

}
}
echo "online:$visitors";
norbis
O proszę, nigdy bym nie wpadł, żeby liczyć to w ten sposób winksmiley.jpg

długość życia tych plików określany jest w php.ini przez opcję session.gc_maxlifetime

Jeśli nie masz możliwości tego zmienić, to zapisuj coś do sesji przy każdym przeładowaniu strony. Przy obliczaniu ilości osób online, odczytuj czas modyfikacji pliku i jeśli starszy od np. 5 minut to go nie licz. Jednak przy większej ilości użytkowników polecałbym mimo wszystko bazę danych.
poli25
Cytat(norbis @ 9.11.2010, 10:32:19 ) *
Jednak przy większej ilości użytkowników polecałbym mimo wszystko bazę danych.

mam właśnie bazę danych jak to zrobić z użyciem bazy danych ?
norbis
Hmm, może coś w ten deseń, choć pewnie da się prościej - jakiś niewyspany jestem winksmiley.jpg:
Tworzysz tabelkę users_online z 2 polami: user_id (integer, auto_increment) oraz time (integer).

  1. //$sql - obiekt PDO
  2. $sql->query("DELETE FROM users_online WHERE time<'".($_SERVER['REQUEST_TIME']-300)."'");
  3. if(is_set($_SESSION['user_id']))
  4. $sql->query("UPDATE users_online SET time='{$_SERVER['REQUEST_TIME']}' WHERE user_id='{$_SESSION['user_id']}'");
  5. else
  6. $_SESSION['user_id'] = $sql->query("INSERT INTO users_online (time) VALUES ('{$_SERVER['REQUEST_TIME']}')");
  7. $online = $sql->query("SELECT count() AS online FROM users_online");
  8. ...


To tak na szybko pisane, ale mam nadzieję, że łapiesz idee. Należałoby oczywiście opakować w jakąś ładną klasę, dodać buforowanie w sesji, bo bez sensu kasowanie i pobieranie co odświeżenie.

edit:

Już widzę błąd, powyższy kod nie policzy osoby, której sesja nie zdążyła wygasnąć, a już została skasowana z bazy, więc musiałbyś i to sprawdzać, może jednak pierwszy pomysł był lepszy tongue.gif
poli25
wiesz próbowałem zmienic czas w php.ini tam było 1440 zmieniłem na 120 ale nadal po tym czasie nie znikają sesje po tym czasie ;( w ogóle to katalog musialem mu wskazać bo nie widział zmieniłem :


$session_path=session_save_path('sesje/');
session_start();


$session_path=session_save_path();
$visitors=0;
$handle=opendir($session_path);

$pattern='/^sess/';
while(($file=readdir($handle))!=FALSE)
{
if($file!="." && $file!="..")
{
if(preg_match($pattern,$file))
$visitors++;

}
}
echo $visitors;

ale nadal nie kasuje mam w katalogu sesje ale nie znikaja
norbis
Jeśli chcesz używać sesji do czegoś innego niż liczenie osób online, to 2 minuty to za mało, spróbuj raczej tak jak pisałem:
  1. $session_path=session_save_path('sesje/');
  2. $_SESSION['time'] = $_SERVER['REQUEST_TIME']; //modyfikujemy plik sesji
  3.  
  4. $session_path=session_save_path();
  5. $visitors=0;
  6. $handle=opendir($session_path);
  7.  
  8. $pattern='/^sess/';
  9. while(($file=readdir($handle))!=FALSE)
  10. {
  11. if($file!="." && $file!="..")
  12. {
  13. if(preg_match($pattern,$file))
  14. if(filemtime($session_path.$file) > $_SERVER['REQUEST_TIME'] - 120) //sprawdzamy, czy plik zmodyfikowany w ciągu 2 ostatnich minut
  15. $visitors++;
  16.  
  17. }
  18. }
  19. echo $visitors;


I przy okazji, uprość sobie życie i korzystaj z możliwości PHP5 - poczytaj o funkcji scandir winksmiley.jpg
poli25
tak to je to tego mi brakowało winksmiley.jpg serdeczne dzięki winksmiley.jpg
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.