login  Naam:   Wachtwoord: 
Registreer je!
 Forum

ip log pauze tijd invoegen

Offline mrnico - 19/08/2015 20:39 (laatste wijziging 19/08/2015 20:53)
Avatar van mrnicoNieuw lid met een samen gezocht script heb ik een bezoekers teller gemaakt die de gegevens in een .DAT bestand plaatst maar ik kan het niet voor elkaar krijgen dat ik er een bepaalde tijd tussen heb voordat hij hem opnieuw schrijft

bijvoorbeeld dat de teller hetzelfde ip adres pas weer opnieuw telt na 45 minuten zodat de teller niet te snel op loopt als er iemand alleen maar op F5 drukt


  1. ## Initiate variables
  2. $newData = "";
  3. $totalHits = 100;
  4. $uniqueHits = count($oldData);
  5. $knownVisitor = false;
  6.  
  7. ## Examine data
  8. for ($i = 0; $i < count($oldData); $i++)
  9. {
  10. $currentRecord = explode(" ", $oldData[$i]);
  11. $totalHits += $currentRecord[1];
  12.  
  13. if ($_SERVER['REMOTE_ADDR'] == $currentRecord[0])
  14. {
  15. $newData .= $currentRecord[0] . " ". ($currentRecord[1] + 1) . "\n";
  16. $knownVisitor = true;
  17. $HpIData = ($currentRecord[1] + 1);
  18. }
  19. else
  20. {
  21. $newData .= $oldData[$i];
  22. }
  23. }
  24. ## WHERE ip=$ip AND tijd > {huidigetijd-30minuten}
  25. if (!$knownVisitor)
  26. {
  27. $newData .= $_SERVER['REMOTE_ADDR'] . " 1\n";
  28. $uniqueHits++;
  29. $HpIData = 1;
  30. }
  31.  
  32. ## Store new data
  33. $logFile = @fopen($FILENAME, 'w');
  34. fwrite($logFile, $newData);
  35. fclose($logFile);
  36. ##echo "|" . $newData . "|";
  37.  
  38. ## Nu Jawade!
  39. if(eregi("(win|windows)[ ]*((nt)*[ /]*([0-9]+(.?[0-9]+))*)", $_SERVER["HTTP_USER_AGENT"]))
  40. {
  41. if(eregi("(win|windows)[ ](95)", $_SERVER["HTTP_USER_AGENT"]))
  42. {
  43. $os = "Win 95";
  44. }
  45. elseif(eregi("(win|windows)[ ](9x)[ ](4.90)", $_SERVER["HTTP_USER_AGENT"]))
  46. {
  47. $os = "Win ME";
  48. }
  49. elseif(eregi("(win|windows)[ ](98)", $_SERVER["HTTP_USER_AGENT"]))
  50. {
  51. $os = "Win 98";
  52. }
  53. elseif(eregi("(win|windows)[ ](NT)", $_SERVER["HTTP_USER_AGENT"]))
  54. {
  55. if(eregi("(win|windows)[ ](NT)[ ](5.1)", $_SERVER["HTTP_USER_AGENT"]))
  56. {
  57. $os = "Win XP";
  58. }
  59. elseif(eregi("(win|windows)[ ](NT)[ ](5.0)", $_SERVER["HTTP_USER_AGENT"]))
  60. {
  61. $os = "Win 2K";
  62. }
  63. elseif(eregi("(win|windows)[ ](NT)[ ](6.0)", $_SERVER["HTTP_USER_AGENT"]))
  64. {
  65. $os = "WVista";
  66. }
  67. elseif(eregi("(win|windows)[ ](NT)[ ](6.1)", $_SERVER["HTTP_USER_AGENT"]))
  68. {
  69. $os = "Win. 7";
  70. }
  71. else
  72. {
  73. $os = "Win NT";
  74. }
  75. }
  76. else
  77. {
  78. $os = "Win???";
  79. }
  80. }
  81. elseif(stristr($_SERVER["HTTP_USER_AGENT"], "Linux"))
  82. {
  83. $os = "Linux ";
  84. }
  85. elseif(stristr($_SERVER["HTTP_USER_AGENT"], "Unix"))
  86. {
  87. $os = "Unix ";
  88. }
  89. elseif(stristr($_SERVER["HTTP_USER_AGENT"], "Mac"))
  90. {
  91. $os = "MacOs ";
  92. }
  93. elseif(stristr($_SERVER["HTTP_USER_AGENT"], "PPC"))
  94. {
  95. $os = "MacOs ";
  96. }
  97. elseif(stristr($_SERVER["HTTP_USER_AGENT"], "HP"))
  98. {
  99. $os = "HPuX ";
  100. }
  101. elseif(stristr($_SERVER["HTTP_USER_AGENT"], "SunOS"))
  102. {
  103. $os = "SunOS ";
  104. }
  105. else
  106. {
  107. $os = "OS=???";
  108. }
  109.  
  110. $tempvar = strtolower($_SERVER["HTTP_USER_AGENT"]);
  111. $browser = "Browser=???";
  112. if (eregi('bot', $tempvar)) { $browser = "Zoekmach"; }
  113. if (eregi('opera/([0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "Opera ".$regs[1]; }
  114. if (eregi('lynx/([0-9]+\.[0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "Lynx ".$regs[1]; }
  115. if (eregi('netscape6/([0-9]+\.[0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "Netscap ".$regs[1]; }
  116. if (eregi('mozilla/([0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "Mozilla ".$regs[1]; }
  117. if (eregi('firefox/([0-9]{0,2}\.[0-9]{0,2}\.[0-9]{0,2})', $tempvar, $regs)) { $browser = "Mozi.FF ".$regs[1]; }
  118. if (eregi('msie ([0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "MS IExp ".$regs[1]; }
  119.  
  120. ##$host_names = explode(".", gethostbyaddr($REMOTE_ADDR));
  121. $host_names = explode(".", gethostbyaddr($_SERVER["REMOTE_ADDR"]));
  122.  
  123.  
  124.  
  125. $logFile = @fopen($FILELOG, "a");
  126. if ($logFile)
  127. {
  128. fwrite($logFile, number_format($totalHits, 0, ',', '.') . " ");
  129. fwrite($logFile, number_format($uniqueHits, 0, ',', '.') . " ");
  130. fwrite($logFile, date("d-m-Y H:i:s", time()) . " ");
  131. $a = $_SERVER['REMOTE_ADDR'];
  132. $a = $a . " (" . $HpIData . "x)";
  133. do
  134. {
  135. $a = $a ." ";
  136. }
  137. while (strlen($a) != 24);
  138. fwrite($logFile, $a);
  139. fwrite($logFile, $os . " ");
  140. fwrite($logFile, $browser);
  141. foreach ($host_names as $hostname)
  142. {
  143. fwrite($logFile, " " . $hostname);
  144. }
  145. fwrite($logFile, "\n");
  146. }
  147. fclose($logFile);

3 antwoorden

Gesponsorde links
Offline Thomas - 19/08/2015 21:19
Avatar van Thomas Moderator Een aantal dingen die mij te binnen schieten:

- is in dit geval het gebruik van een database niet veel praktischer?

- hetzelfde IP kan door meerdere eindgebruikers gebruikt worden, een IP hoeft dus niet per definitie gelijk te zijn aan het aantal "unieke bezoekers"

- er was iets met schrijven naar bestanden, volgens mij moet je deze expliciet/exclusief locken als je er van verzekerd wilt zijn dat deze niet corrupt raken / er geen data verloren gaat, dit lijkt mij nog een reden om gebruik te maken van een database, als je daar de beschikking over hebt

Deze constructie wordt ook steeds trager, naarmate dit bestand groeit?, dat lijkt mij ook niet erg praktisch.
Offline mrnico - 19/08/2015 21:30
Avatar van mrnico Nieuw lid het is een logger voor een bepaalde pagina die niet heel veel bezocht gaat worden. Het is niet voor de home pagina dus dat traag worden ben ik niet zo bang voor. (maar bedankt voor de zorgen) denk dat het op 1000 in een jaar word ongeveer maar de tussen tijd is meer voor als ik zelf een paar keer de pagina test dat ik elke keer geregistreerd word

of ik moet een ip adres kunnen invoegen die hij niet registreert
Offline Thomas - 19/08/2015 21:58 (laatste wijziging 20/08/2015 23:18)
Avatar van Thomas Moderator Hm, is nu ook niet een beetje het probleem dat dat bestand één brok data is, zonder structuur? Wat nu als je deze data opslaat als een array, bijvoorbeeld door deze te serialiseren of op te slaan als JSON? Volgens mij kun je er dan veel sneller doorheen rennen en hier mee rekenen. Je kunt dan ook snel(ler) kijken wanneer het laatste bezoek van een IP is lijkt mij.

Daarnaast zou je een ander bestand bij kunnen houden waarin een lijstje van IPs zit die buiten beschouwing gelaten zou moeten worden.

Maar wat je dan in feite aan het doen bent is met bestanden database-tabellen bouwen .

Bovenstaande wijziging (aanbrengen van enige structuur in de data, zodat je de onderdelen waaruit deze is opgebouwd kunt onderscheiden) zou al een verbetering zijn denk ik, maar een database lijkt mij nog altijd makkelijker .

Hier een opzetje voor een variant met CSV + instelbare timeout:
  1. <?php
  2. ini_set('display_errors', 'stdout');
  3. ?>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta charset="UTF-8">
  8. <title>structured counter file with locking</title>
  9. </head>
  10.  
  11. <body>
  12. <?php
  13. // http://stackoverflow.com/questions/2450850/read-and-write-to-a-file-while-keeping-lock
  14.  
  15. $source = 'counter.csv'; // make sure this file exists
  16. $timeout = 5; // seconds
  17.  
  18. ?><p> current time is <?php echo $_SERVER['REQUEST_TIME'] ?></p><?php
  19.  
  20. if (file_exists($source)) {
  21. $fp = fopen($source, 'r+'); // lezen + schrijven
  22. if (flock($fp, LOCK_EX)) { // exclusieve (blocking) lock
  23. $found = false;
  24. $write = false;
  25.  
  26. $ip = $_SERVER['REMOTE_ADDR'];
  27. $ua = $_SERVER['HTTP_USER_AGENT'];
  28. $ts = $_SERVER['REQUEST_TIME'];
  29.  
  30. $lastEntry = false;
  31.  
  32. // IP, TIMESTAMP, USER AGENT
  33. while (($row = fgetcsv($fp, 1000, ',', '"')) !== false) {
  34. if ($row[0] == $ip) {
  35. $found = true;
  36. $lastEntry = $row[2];
  37. /* ?><p>[info] IPs match, saving time of last entry</p><?php */
  38. // @todo check UA - different UA might imply different user
  39. }
  40. }
  41.  
  42. if ($lastEntry !== false && $lastEntry + $timeout < $ts) {
  43. ?><p>[info] timeout exceeded - creating new entry</p><?php
  44. $write = true;
  45. } else {
  46. ?><p>[info] timeout not exceeded - skipping</p><?php
  47. }
  48.  
  49. if ($write || $found === false) {
  50. fputcsv($fp, array($ip, $ua, $ts), ',', '"');
  51. }
  52.  
  53. flock($fp, LOCK_UN);
  54. } else {
  55. ?><p>[error] could not obtain lock</p><?php
  56. // tsja... pech?
  57. }
  58. fclose($fp);
  59. } else {
  60. ?><p>[error] no counter file found</p><?php
  61. }
  62. ?>[end]
  63. </body>
  64. </html>

Idealiter schrijf je de laatste entry naar het begin van het bestand, zodat je eerste IP-match ook meteen de meest recente visite is. Helaas werkt het schrijven naar het begin van een bestand niet (zo fijn).
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.2s