Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Ilość osób on-line
Forum PHP.pl > Forum > Przedszkole
kilas88
Witam. Mam takie pytanie - jak stworzyć przy pomocy języka php licznik obliczający ilość osób obecnie przebywających na całym serwisie (zliczając wszystkie podstrony), jak i drugi licznik, obliczający ile osób obecnie przebywa na wybranej, jednej podstronie? Z góry dziękuję za pomoc.
sammael
Witam. Stwórz w BD tablicę users_online z polami o nazwach kolejno: sid, time, dag (varchar(100), varchar(15), varchar(3)). Ja to wykombinowałem kiedyś tak:

  1. <?php
  2. $SID = session_id();
  3.  $time = time();
  4.  $dag = date("z");
  5.  $nu = time()-180; // sprawdza aktywnych userow w ciagu ostatnich 3 minut (180 sekund)
  6.  
  7.  $sid_check = mysql_query("SELECT count(*) FROM users_online WHERE SID='$SID';");
  8.  
  9.  $visits_counter = config("visits_counter")+1; // u mnie config("visits_counter") wyciaga z bazy stary stan licznika - do przerobienia
  10.  
  11.  if (mysql_result($sid_check, 0) == 0)
  12.  {
  13. mysql_query("INSERT INTO users_online VALUES ('$SID', '$time', '$dag');");
  14. config_update("visits_counter", $visits_counter); // u mnie config_update("visits_counter", $visits_counter); zapisuje do bazy nowy stan licznika 
  15.  }
  16.  else
  17.  {
  18. mysql_query("UPDATE users_online SET time='$time' WHERE SID='$SID';");
  19.  }
  20.  
  21.  $count_users = mysql_query("SELECT count(*) FROM users_online WHERE (time>'$nu') AND (day='$dag');");
  22.  $users_online_counter = mysql_result($count_users, 0);
  23.  
  24. mysql_query("DELETE FROM users_online WHERE time<'$nu';");
  25.  mysql_query("DELETE FROM users_online WHERE day<>'$dag';");
  26. ?>


No i tym sposobem w $users_online_counter masz ilość userów online a w $visits_counter ilość odwiedzin. Kod może nie jest genialny ale działa. Pozdrawiam.
kilas88
Może i jest to jakiś sposób, jednak.. nie dałoby się jakoś wyciągnąć takie informacje bez użycia bazy danych? Po co niepotrzebnie obciążać bazę : )
Cysiaczek
Da się,
Bez dokumentacji, ale może coś wyciągniesz z tego (musisz trochę przerobić)
  1. <?php
  2. class onlineInfo
  3. {
  4.  
  5. static $dir=APP_DIR;
  6. static $dataFile;
  7. private $maxLastSeenTime=20;
  8. private $userOnList=false;
  9.  
  10.  
  11. public function __construct()
  12. {
  13.  
  14. self::$dataFile=self::$dir.'/temp/usersOnline.tmp';
  15. if(!file_exists(self::$dataFile))
  16. {
  17. $this->save();
  18. }
  19.  
  20. $this->userIp=$_SERVER['REMOTE_ADDR'];
  21. $this->load();
  22. $this->checkVisitors();
  23. $this->save();
  24.  
  25. }
  26.  
  27. private function load()
  28. {
  29. $this->data=file(self::$dataFile);
  30. $count=count($this->data);
  31. if($count>0)
  32. {
  33.  
  34. for($i=0;$i<$count;++$i)
  35. {
  36. $this->data[$i]=trim($this->data[$i]);
  37. $this->userInfo[$i]=explode("|", $this->data[$i]);
  38. if($this->userInfo[$i][0]==$this->userIp)
  39. {
  40. $this->userOnList=true;
  41. $this->lastAvtivityTime=$this->userInfo[$i][0];
  42. }
  43. }
  44. }
  45.  
  46. if(!$this->userOnList)
  47. {
  48.  
  49. $this->userInfo[$count][0]=$this->userIp;
  50. $this->userInfo[$count][1]=time();
  51. }
  52.  
  53. }
  54.  
  55. function checkVisitors()
  56. {
  57. $count=count($this->userInfo);
  58. $currentTime=time();
  59. if($count>0)
  60. {
  61. for($i=0;$i<$count;++$i)
  62. {
  63. //print 'Diff '.($currentTime-$this->userInfo[$i][1])."<br />";
  64. if($this->maxLastSeenTime<=($currentTime-$this->userInfo[$i][1]))
  65. {
  66. //print 'aol';
  67. if($this->userInfo[$i][0]==$this->userIp)
  68. {
  69. $this->userInfo[$i][1]=time();
  70. continue;
  71. }
  72. unset($this->userInfo[$i]);
  73. }
  74. else
  75. {
  76. if($this->userInfo[$i][0]==$this->userIp)
  77. {
  78. $this->userInfo[$i][1]=time();
  79. }
  80. }
  81. }
  82. }
  83. }
  84.  
  85. public function getVisitors()
  86. {
  87. return count($this->userInfo);
  88. }
  89.  
  90. function save()
  91. {
  92. $string='';
  93. $count=count($this->userInfo);
  94.  
  95. $this->saveArray=array();
  96. $this->userInfo=array_merge($this->saveArray, $this->userInfo);
  97.  
  98. $lineEnd="\n";
  99. if($count>0)
  100. {
  101. for($i=0;$i<$count;++$i)
  102. {
  103. if($i==$count-1)
  104. {
  105. $lineEnd='';
  106. }
  107. if(is_array($this->userInfo[$i]))
  108. {
  109. $string.=implode("|", $this->userInfo[$i]).$lineEnd;
  110. }
  111. }
  112. }
  113. file_put_contents(self::$dataFile, $string);
  114. }
  115. }
  116. ?>
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.