Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]licznik osob online + licznik unikalnych odwiedzin
Forum PHP.pl > Forum > Przedszkole
seba22
Witam,

Stanąłem nad tym aby wykonać licznik unikalnych odwiedzin + licznik osób online..

Za osoby online nie mam pojęcia jak się wziąć... zero pomysłu.


Na unikalne wizyty mam 2 pomysły.

1) baza adresów IP które odwiedzały stronę, facet wchodzi, patrzymy czy jego ip jest w bazie, jeżeli tak, nie przesuwamy licznika, jeżeli nie było przesówamy o jeden.

2) pomysł chyba bardziej wydajny, ale bardziej zawodny - do sesji wstawiam następujące dane:

Sprawdzamy czy w sesji jest odwiedzałem = 1; jeżeli tak to nie przesówamy licznika, jeżeli nie, to przesówamy licznik i dodajemy wartość odwiedzalem = 1.

Po ponownym odświerzeniu nie zliczy nam faceta..

( pomysł pierwszy, chyba będzie pobierać zbyt wiele zasobów serwera, więc raczej skupił bym się na drugim).
Ale ostatecznie interesuje mnie wasze zdanie winksmiley.jpg


A co sądzicie o wypisaniu osób będących aktualnie online ?
Jak to można wykonać ?

Pozdrawiam....
bregovic
Co do unikalnych odwiedzin, to patrz raczej po IP. Sesje umierają dość szybko (możesz oczywiście ustawić cookie, żeby nie sprawdzać w bazie jak już ktoś jest zarejestrowany).
Co do osób aktualnie online, to dość proste. Tworzysz tabele z miejscem na session_id" title="Zobacz w manualu PHP" target="_manual i timestamp. Przy każdym wywołaniu strony usuwasz wszystkie wpisy starsze niż określony czas, i wpisujesz aktualne session_id i aktualny timestamp. Aby wiedzieć ile osób jest na stronie robisz select distinct i po sprawie.
seba22
Co to jest timestamp ?
bregovic
timestamp to liczba sekund od epoki uniksowej, vide time" title="Zobacz w manualu PHP" target="_manual. Ale możesz użyć jakiegokolwiek formatu czasu, suit your self winksmiley.jpg
seba22
Dobra napisałem takie coś - oczywiście zdaje się działać poprawnie w 100 % winksmiley.jpg

Jakieś sugestie jak to przyśpieszyć ?

Wydaje mi się że wykonywanie tej procedury sprawdzania czy dalej są zalogowani, można by wrzucić do Crona ( aby przyśpieszyć wczytywanie strony).


Tak więc czekam na informację co można ulepszyć winksmiley.jpg

  1. <?
  2.  
  3. $ses_id = session_id();
  4. $ses_log=$_SESSION['username'];
  5.  
  6. //
  7.  
  8. $obecna_data = date("Y-m-d H:i");
  9.  
  10. $data_plus_5m_timestamp = mktime(date('H'), date('i')+5, 0, date('m'), date('d'), date('Y'));
  11.  
  12. $data_plus_5m = date("Y-m-d H:i", $data_plus_5m_timestamp);
  13.  
  14. //
  15.  
  16.  
  17.  
  18.  
  19. //Dopisy do bazy danych
  20. $q = mysql_query("SELECT * FROM `online` WHERE idsesja = '$ses_id'") or die (mysql_error());
  21. $r = mysql_num_rows($q);
  22. if ($r ==1)
  23.  
  24. {
  25. $querystatus = "UPDATE online SET idaktywny='$data_plus_5m', idlogin='$ses_log' WHERE idsesja='$ses_id'";
  26. $resultstatus=mysql_query($querystatus);
  27. }
  28.  
  29. else
  30. {
  31. mysql_query("INSERT INTO `online` (idsesja,idlogin,idaktywny) VALUES ('$ses_id','$ses_log','$data_plus_5m')") or die (mysql_error());
  32. }
  33. //Dopisy do bazy danych
  34.  
  35.  
  36.  
  37. //Kasowanie starych wpisów
  38. $queryid="SELECT id,idaktywny FROM online";
  39. $odpowiedz=mysql_query($queryid);
  40.  
  41. while($row = mysql_fetch_assoc($odpowiedz))
  42. {      
  43.  
  44. $id=($row['id']);        
  45. $idaktywny=($row['idaktywny']);
  46.  
  47. if ($idaktywny<=$obecna_data)
  48. {
  49. //Kasuje sesje
  50. $zapytanie = "DELETE FROM `online` WHERE id = '$id'";
  51. $odpowiedz=mysql_query($zapytanie);  
  52. //Kasuje sesje
  53. }
  54.  
  55. }
  56. //Kasowanie starych wpisow
  57.  
  58.  
  59.  
  60. //Liczenie osób...
  61. $queryid="SELECT idlogin FROM online";
  62. $odpowiedz=mysql_query($queryid);
  63.  
  64. $osobonline=0;
  65. $osobyonline='';
  66. while($row = mysql_fetch_assoc($odpowiedz))
  67. {      
  68.  
  69. $osobonline=$osobonline+1;
  70.  
  71. if ($row['idlogin']!='')
  72. {
  73. $osobyonline=$osobyonline.$row['idlogin'];
  74. }
  75.  
  76. }
  77. //Liczenie osób...
  78.  
  79. echo("Osób online: $osobonline <br> Użytkownicy online : $osobyonline");
  80.  
  81.  
  82.  
  83.  
  84. ?>
ferrero2
Tutaj licznik on-line (mój post) - nie mam żadnych z Nim problemów zawsze działa.

http://forum.php.pl/index.php?showtopic=100833&hl=online

Jeśli chodzi o unikatowe wejścia nie tylko zarejestrowanych użytkowników - to robisz to po IP.

Pozdrawiam
bregovic
Ok, zamiast tego:
  1. <?php
  2. $data_plus_5m_timestamp = mktime(date('H'), date('i')+5, 0, date('m'), date('d'), date('Y'));
  3. $data_plus_5m = date("Y-m-d H:i", $data_plus_5m_timestamp);
  4. ?>

Zrób tak:
  1. <?php
  2. $data_plus_5m = date("Y-m-d H:i", strtotime('+5 minutes'));
  3. ?>


Poza tym robisz zdecydowanie za dużo zapytań. Możesz to wszystko wykonać używając 3 zapytań (lub 2 jeśli użyjesz cron'a). Zapytania w kolejności wykonania:
  1. <?php
  2. $time = strtotime('-5 minutes');
  3. $user_id = $_SESSION['user_id']; // ID zalogowanego użyszkodnika
  4. mysql_query("DELETE FROM online WHERE last_active<'".$time."' OR session_id='".session_id()."';");
  5. mysql_query("INSERT INTO online SET last_active='".time()."', session_id='".session_id()."', user_id='".$user_id."';");
  6. mysql_query('SELECT DISTINCT * FROM online;');
  7. ?>

Ustawiasz default w user_id na 0. Każdy rekord z user_id=0 to nie zalogowany user, reszta to zalogowani.
Jeśli użyjesz cron'a, wrzuć do niego pierwsze zapytanie, bez session_id.
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.