Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Czas przebywania na stronie.
Forum PHP.pl > Forum > Przedszkole
Kużdo
Witam,

W jaki najłatwiejszy sposób zrealizować zapis czasu przebywania na stronie przez usera?

Myślałem o ciasteczkach i skrypcie JS, który przy opuszczaniu strony zapisywałby czas przebywania do ciasteczka. Przy wejściu na kolejną podstronę PHP odczytywałoby ciasteczko z dokładnym czasem. Ale nie wiem czy tak można zrobić, a poza tym nie znam się akurat na JS.

Byłby ktoś chętny pomóc/nakierować?

Pozdrawiam
Ruch Radzionków
ja posiadam zliczanie ile osob jest na stronie w pliku textowym on zapisuje ip oraz obok tego jest od kiedy jest dano ip to mozesz sobie przerobic na sprawdzanie od danego uzytkownika ile jest na stronie
  1. $minut = 1;
  2. $teraz = time();
  3. $aktywnosc = $teraz - (60 * $minut);
  4. $teraz = time()+60*$minut;
  5. $bazaip = file("ip.txt");
  6. $ile = count($bazaip);
  7. $ip = $_SERVER["REMOTE_ADDR"];
  8. for ($i=0;$i<$ile;$i++)
  9. {
  10. $pol = explode("`",$bazaip[$i]);
  11. if ($pol[2]<time())
  12. { $bazaip[$i]=""; }
  13. if ($pol[1]==$ip)
  14. { $bazaip[$i]="`$ip`$teraz`<br>\n"; $jest=1; }
  15. }
  16. if ($jest<>1) $bazaip[]="`$ip`$teraz`\n";
  17. $f = fopen("ip.txt","w");flock($f,2);
  18. for ($i=0;$i<$ile+1;$i++)
  19. {
  20. if ($bazaip[$i]<>"") { fwrite($f, $bazaip[$i]); $ileip++; }
  21. }
  22. flock($f,3); fclose($f);
Barcelona
Tak, to się sprawdza kiedy chcesz widzieć ilu jest userów, ale problem w tym że kolega chce widzieć jak długo dany user jest na stronie.
Ja osobiście jestem przeciwnikiem korzystania z obsługi plików. Korzystało się z nich w czasach kiedy hostingi z bazą były drogie, teraz są inne czasy i takie rzeczy są w standardzie. Problemem są również dzisiejsze przeglądarki, które zapamiętują bieżącą sesję, nawet jeżeli zamknęło się zakładkę ze stroną.
Nie jest problemem policzyć od kiedy jest bo można to zrobić automatem w chwili logowania. Jednak nie każdy user się wylogowuje, i tutaj jest kot pogrzebany ;p
Sam jestem ciekaw jak można rozwiązać Twój problem smile.gif Pozdrawiam
Ruch Radzionków
a jak bys to sprowadzil do sesji ze po zalogowaniu zabpisuje np.
$_SESSION[czas] = time();

i potem odczytujesz to moim zdaniem bylo by lepsze i to by sie sprawdzilo
Barcelona
Tak, ale weź pod uwagę, że sesja funkcjonuje nawet po wyłączeniu karty ze stroną. bynajmniej w Operze, Chromie, FF itd.
Ruch Radzionków
w inny sposob raczej nie zobaczysz moze przy uzyciu js
Barcelona
Na upartego, jeżeli jest to takie ważne, można wysyłać confirm do user czy nadal korzysta ze strony. Ale to już była by łopata smile.gif
Kużdo
Doszedłem do rozwiązania i proszę bardzo dla potomnych:

Korzystać z JS, a mianowicie ja skorzystałem z jQuery (bo i tak z niego korzystam) i funkcji unload() i ajax(). Przy wejściu na stronę do bazy zapisywany jest czas rozpoczęcia sesji, a po zamknięciu zakładki/strony/etc skrypt JS przesyła dane do drugiego skryptu, który dopisuje czas do bazy jako koniec sesji.
Barcelona
A czy mógłbyś podzielić się kodem; Tak się składa, że jestem tym potomnym smile.gif ;
Kużdo
  1. <script type="text/javascript">
  2. $(window).unload(function(){
  3. $.ajax({
  4. type: "POST",
  5. url: "ajax.php",
  6. data: "id=5"
  7. });
  8. });

W data podajesz zmienne dzięki którym możesz identyfikować osobników. Przykładowo możesz wstawiać tam jakiś hash wygenerowany dla każdego wywołania osobno i unikalny, ew. łączony z innymi zmiennymi. Zmienne podajesz w formacie nazwa1=wartosc1&nazwa2=wartosc2. Jeżeli to ma być tylko zliczanie czasu pobytu, to tyle wystarczy.

ajax.php to plik, który ma być wywoływany tylko i wyłącznie przez JS. Przydałoby się go też odpowiedno zabezpieczyć. Ale najprostsza wersja, bez zabezpieczeń, etc, etc, etc, to np.:
  1. <?php
  2. $dbhost = 'localhost';
  3. $dbuser = 'root';
  4. $dbpass = 'password';
  5. $dbname = 'database';
  6.  
  7. @mysql_connect($dbhost, $dbuser, $dbpass);
  8. @mysql_query("SET NAMES 'utf8'");
  9. @mysql_select_db($dbname);
  10.  
  11. $result = mysql_query("UPDATE `history` SET `end` = '".time()."' WHERE `id` = '".$_POST['id']."'");
  12. ?>


Inna wersja to przykładowo zapisywanie czasu startu sesji do zmiennych sesyjnych, a w pliku AJAX odejmowanie od obecnego czasu, czasu ze zmiennej sesyjnej i dopiero zapisanie tego do bazy, wtedy ma się tylko jedno zapytanie na wywołanie strony:
  1. $dlugosc_pobytu = time() - $_SESSION['start_sesji'];
  2. $result = mysql_query("INSERT INTO `history` (`login`, `ip`, `start`, `dlugosc`) VALUES ('{$_SESSION['login']}', '{$_SERVER['REMOTE_ADDR']}', '{$_SESSION['start_sesji']}', '{$dlugosc_pobytu}')");


Pozdrawiam smile.gif
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.