ip log pauze tijd invoegen
mrnico - 19/08/2015 20:39 (laatste wijziging 19/08/2015 20:53)
Nieuw 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
## Initiate variables
$newData = "";
$totalHits = 100;
$uniqueHits = count($oldData);
$knownVisitor = false;
## Examine data
for ($i = 0; $i < count($oldData); $i++)
{
$currentRecord = explode(" ", $oldData[$i]);
$totalHits += $currentRecord[1];
if ($_SERVER['REMOTE_ADDR'] == $currentRecord[0])
{
$newData .= $currentRecord[0] . " ". ($currentRecord[1] + 1) . "\n";
$knownVisitor = true;
$HpIData = ($currentRecord[1] + 1);
}
else
{
$newData .= $oldData[$i];
}
}
## WHERE ip=$ip AND tijd > {huidigetijd-30minuten}
if (!$knownVisitor)
{
$newData .= $_SERVER['REMOTE_ADDR'] . " 1\n";
$uniqueHits++;
$HpIData = 1;
}
## Store new data
$logFile = @fopen($FILENAME, 'w');
fwrite($logFile, $newData);
fclose($logFile);
##echo "|" . $newData . "|";
## Nu Jawade!
if(eregi("(win|windows)[ ]*((nt)*[ /]*([0-9]+(.?[0-9]+))*)", $_SERVER["HTTP_USER_AGENT"]))
{
if(eregi("(win|windows)[ ](95)", $_SERVER["HTTP_USER_AGENT"]))
{
$os = "Win 95";
}
elseif(eregi("(win|windows)[ ](9x)[ ](4.90)", $_SERVER["HTTP_USER_AGENT"]))
{
$os = "Win ME";
}
elseif(eregi("(win|windows)[ ](98)", $_SERVER["HTTP_USER_AGENT"]))
{
$os = "Win 98";
}
elseif(eregi("(win|windows)[ ](NT)", $_SERVER["HTTP_USER_AGENT"]))
{
if(eregi("(win|windows)[ ](NT)[ ](5.1)", $_SERVER["HTTP_USER_AGENT"]))
{
$os = "Win XP";
}
elseif(eregi("(win|windows)[ ](NT)[ ](5.0)", $_SERVER["HTTP_USER_AGENT"]))
{
$os = "Win 2K";
}
elseif(eregi("(win|windows)[ ](NT)[ ](6.0)", $_SERVER["HTTP_USER_AGENT"]))
{
$os = "WVista";
}
elseif(eregi("(win|windows)[ ](NT)[ ](6.1)", $_SERVER["HTTP_USER_AGENT"]))
{
$os = "Win. 7";
}
else
{
$os = "Win NT";
}
}
else
{
$os = "Win???";
}
}
elseif(stristr($_SERVER["HTTP_USER_AGENT"], "Linux"))
{
$os = "Linux ";
}
elseif(stristr($_SERVER["HTTP_USER_AGENT"], "Unix"))
{
$os = "Unix ";
}
elseif(stristr($_SERVER["HTTP_USER_AGENT"], "Mac"))
{
$os = "MacOs ";
}
elseif(stristr($_SERVER["HTTP_USER_AGENT"], "PPC"))
{
$os = "MacOs ";
}
elseif(stristr($_SERVER["HTTP_USER_AGENT"], "HP"))
{
$os = "HPuX ";
}
elseif(stristr($_SERVER["HTTP_USER_AGENT"], "SunOS"))
{
$os = "SunOS ";
}
else
{
$os = "OS=???";
}
$tempvar = strtolower($_SERVER["HTTP_USER_AGENT"]);
$browser = "Browser=???";
if (eregi('bot', $tempvar)) { $browser = "Zoekmach"; }
if (eregi('opera/([0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "Opera ".$regs[1]; }
if (eregi('lynx/([0-9]+\.[0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "Lynx ".$regs[1]; }
if (eregi('netscape6/([0-9]+\.[0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "Netscap ".$regs[1]; }
if (eregi('mozilla/([0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "Mozilla ".$regs[1]; }
if (eregi('firefox/([0-9]{0,2}\.[0-9]{0,2}\.[0-9]{0,2})', $tempvar, $regs)) { $browser = "Mozi.FF ".$regs[1]; }
if (eregi('msie ([0-9]+\.[0-9]+)', $tempvar, $regs)) { $browser = "MS IExp ".$regs[1]; }
##$host_names = explode(".", gethostbyaddr($REMOTE_ADDR));
$host_names = explode(".", gethostbyaddr($_SERVER["REMOTE_ADDR"]));
$logFile = @fopen($FILELOG, "a");
if ($logFile)
{
fwrite($logFile, number_format($totalHits, 0, ',', '.') . " ");
fwrite($logFile, number_format($uniqueHits, 0, ',', '.') . " ");
fwrite($logFile, date("d-m-Y H:i:s", time()) . " ");
$a = $_SERVER['REMOTE_ADDR'];
$a = $a . " (" . $HpIData . "x)";
do
{
$a = $a ." ";
}
while (strlen($a) != 24);
fwrite($logFile, $a);
fwrite($logFile, $os . " ");
fwrite($logFile, $browser);
foreach ($host_names as $hostname)
{
fwrite($logFile, " " . $hostname);
}
fwrite($logFile, "\n");
}
fclose($logFile);
## Initiate variables
$newData = "" ;
$totalHits = 100 ;
$uniqueHits = count ( $oldData ) ; $knownVisitor = false ;
## Examine data
for ( $i = 0 ; $i < count ( $oldData ) ; $i ++ ) {
$currentRecord = explode ( " " , $oldData [ $i ] ) ; $totalHits += $currentRecord [ 1 ] ;
if ( $_SERVER [ 'REMOTE_ADDR' ] == $currentRecord [ 0 ] )
{
$newData .= $currentRecord [ 0 ] . " " . ( $currentRecord [ 1 ] + 1 ) . "\n " ;
$knownVisitor = true ;
$HpIData = ( $currentRecord [ 1 ] + 1 ) ;
}
else
{
$newData .= $oldData [ $i ] ;
}
}
## WHERE ip=$ip AND tijd > {huidigetijd-30minuten}
if ( ! $knownVisitor )
{
$newData .= $_SERVER [ 'REMOTE_ADDR' ] . " 1\n " ;
$uniqueHits ++;
$HpIData = 1 ;
}
## Store new data
$logFile = @ fopen ( $FILENAME , 'w' ) ; ##echo "|" . $newData . "|";
## Nu Jawade!
if ( eregi ( "(win|windows)[ ]*((nt)*[ /]*([0-9]+(.?[0-9]+))*)" , $_SERVER [ "HTTP_USER_AGENT" ] ) ) {
if ( eregi ( "(win|windows)[ ](95)" , $_SERVER [ "HTTP_USER_AGENT" ] ) ) {
$os = "Win 95" ;
}
elseif ( eregi ( "(win|windows)[ ](9x)[ ](4.90)" , $_SERVER [ "HTTP_USER_AGENT" ] ) ) {
$os = "Win ME" ;
}
elseif ( eregi ( "(win|windows)[ ](98)" , $_SERVER [ "HTTP_USER_AGENT" ] ) ) {
$os = "Win 98" ;
}
elseif ( eregi ( "(win|windows)[ ](NT)" , $_SERVER [ "HTTP_USER_AGENT" ] ) ) {
if ( eregi ( "(win|windows)[ ](NT)[ ](5.1)" , $_SERVER [ "HTTP_USER_AGENT" ] ) ) {
$os = "Win XP" ;
}
elseif ( eregi ( "(win|windows)[ ](NT)[ ](5.0)" , $_SERVER [ "HTTP_USER_AGENT" ] ) ) {
$os = "Win 2K" ;
}
elseif ( eregi ( "(win|windows)[ ](NT)[ ](6.0)" , $_SERVER [ "HTTP_USER_AGENT" ] ) ) {
$os = "WVista" ;
}
elseif ( eregi ( "(win|windows)[ ](NT)[ ](6.1)" , $_SERVER [ "HTTP_USER_AGENT" ] ) ) {
$os = "Win. 7" ;
}
else
{
$os = "Win NT" ;
}
}
else
{
$os = "Win???" ;
}
}
elseif ( stristr ( $_SERVER [ "HTTP_USER_AGENT" ] , "Linux" ) ) {
$os = "Linux " ;
}
elseif ( stristr ( $_SERVER [ "HTTP_USER_AGENT" ] , "Unix" ) ) {
$os = "Unix " ;
}
elseif ( stristr ( $_SERVER [ "HTTP_USER_AGENT" ] , "Mac" ) ) {
$os = "MacOs " ;
}
elseif ( stristr ( $_SERVER [ "HTTP_USER_AGENT" ] , "PPC" ) ) {
$os = "MacOs " ;
}
elseif ( stristr ( $_SERVER [ "HTTP_USER_AGENT" ] , "HP" ) ) {
$os = "HPuX " ;
}
elseif ( stristr ( $_SERVER [ "HTTP_USER_AGENT" ] , "SunOS" ) ) {
$os = "SunOS " ;
}
else
{
$os = "OS=???" ;
}
$tempvar = strtolower ( $_SERVER [ "HTTP_USER_AGENT" ] ) ; $browser = "Browser=???" ;
if ( eregi ( 'bot' , $tempvar ) ) { $browser = "Zoekmach" ; } if ( eregi ( 'opera/([0-9]+\.[0-9]+)' , $tempvar , $regs ) ) { $browser = "Opera " . $regs [ 1 ] ; } if ( eregi ( 'lynx/([0-9]+\.[0-9]+\.[0-9]+)' , $tempvar , $regs ) ) { $browser = "Lynx " . $regs [ 1 ] ; } if ( eregi ( 'netscape6/([0-9]+\.[0-9]+\.[0-9]+)' , $tempvar , $regs ) ) { $browser = "Netscap " . $regs [ 1 ] ; } if ( eregi ( 'mozilla/([0-9]+\.[0-9]+)' , $tempvar , $regs ) ) { $browser = "Mozilla " . $regs [ 1 ] ; } if ( eregi ( 'firefox/([0-9]{0,2}\.[0-9]{0,2}\.[0-9]{0,2})' , $tempvar , $regs ) ) { $browser = "Mozi.FF " . $regs [ 1 ] ; } if ( eregi ( 'msie ([0-9]+\.[0-9]+)' , $tempvar , $regs ) ) { $browser = "MS IExp " . $regs [ 1 ] ; }
##$host_names = explode(".", gethostbyaddr($REMOTE_ADDR));
$logFile = @ fopen ( $FILELOG , "a" ) ; if ( $logFile )
{
$a = $_SERVER [ 'REMOTE_ADDR' ] ;
$a = $a . " (" . $HpIData . "x)" ;
do
{
$a = $a . " " ;
}
foreach ( $host_names as $hostname )
{
fwrite ( $logFile , " " . $hostname ) ; }
}
3 antwoorden
Gesponsorde links
Thomas - 19/08/2015 21:19
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.
mrnico - 19/08/2015 21:30
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
Thomas - 19/08/2015 21:58 (laatste wijziging 20/08/2015 23:18)
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:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>structured counter file with locking</title>
</head>
<body>
<?php
// http://stackoverflow.com/questions/2450850/read-and-write-to-a-file-while-keeping-lock
$source = 'counter.csv'; // make sure this file exists
$timeout = 5; // seconds
?><p> current time is <?php echo $_SERVER['REQUEST_TIME'] ?></p><?php
clearstatcache();
if (file_exists($source)) {
$fp = fopen($source, 'r+'); // lezen + schrijven
if (flock($fp, LOCK_EX)) { // exclusieve (blocking) lock
$found = false;
$write = false;
$ip = $_SERVER['REMOTE_ADDR'];
$ua = $_SERVER['HTTP_USER_AGENT'];
$ts = $_SERVER['REQUEST_TIME'];
$lastEntry = false;
// IP, TIMESTAMP, USER AGENT
while (($row = fgetcsv($fp, 1000, ',', '"')) !== false) {
if ($row[0] == $ip) {
$found = true;
$lastEntry = $row[2];
/* ?><p>[info] IPs match, saving time of last entry</p><?php */
// @todo check UA - different UA might imply different user
}
}
if ($lastEntry !== false && $lastEntry + $timeout < $ts) {
?><p>[info] timeout exceeded - creating new entry</p><?php
$write = true;
} else {
?><p>[info] timeout not exceeded - skipping</p><?php
}
if ($write || $found === false) {
fputcsv($fp, array($ip, $ua, $ts), ',', '"');
}
flock($fp, LOCK_UN);
} else {
?><p>[error] could not obtain lock</p><?php
// tsja... pech?
}
fclose($fp);
} else {
?><p>[error] no counter file found</p><?php
}
?>[end]
</body>
</html>
<?php
ini_set ( 'display_errors' , 'stdout' ) ; ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>structured counter file with locking</title>
</head>
<body>
<?php
// http://stackoverflow.com/questions/2450850/read-and-write-to-a-file-while-keeping-lock
$source = 'counter.csv' ; // make sure this file exists
$timeout = 5 ; // seconds
?> <p> current time is
<?php echo $_SERVER [ 'REQUEST_TIME' ] ?> </p>
<?php
$fp = fopen ( $source , 'r+' ) ; // lezen + schrijven if ( flock ( $fp , LOCK_EX
) ) { // exclusieve (blocking) lock $found = false ;
$write = false ;
$ip = $_SERVER [ 'REMOTE_ADDR' ] ;
$ua = $_SERVER [ 'HTTP_USER_AGENT' ] ;
$ts = $_SERVER [ 'REQUEST_TIME' ] ;
$lastEntry = false ;
// IP, TIMESTAMP, USER AGENT
while ( ( $row = fgetcsv ( $fp , 1000 , ',' , '"' ) ) !== false ) { if ( $row [ 0 ] == $ip ) {
$found = true ;
$lastEntry = $row [ 2 ] ;
/* ?><p>[info] IPs match, saving time of last entry</p><?php */
// @todo check UA - different UA might imply different user
}
}
if ( $lastEntry !== false && $lastEntry + $timeout < $ts ) {
?> <p>[info] timeout exceeded - creating new entry</p><?php
$write = true ;
} else {
?> <p>[info] timeout not exceeded - skipping</p><?php
}
if ( $write || $found === false ) {
fputcsv
( $fp , array ( $ip , $ua , $ts ) , ',' , '"' ) ; }
} else {
?> <p>[error] could not obtain lock</p><?php
// tsja... pech?
}
} else {
?> <p>[error] no counter file found</p><?php
}
?> [end]
</body>
</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.