mardi 23 mai 2017

Visits to web page is counted multitple times php

So there is the problem:

I've made some php code to register page views (with a lot of help from stack overflow). To deal with browser behaviour like prefetching and the like, I am trying to filter out the extra page views with an if, elseif, else function.

The problem in practice is that the sometimes pageviews are either written twice to the log file or there is a timing issue with the if-statement and the rest of the code.

Here is the code I have:

<?php

/*set variables  for log file */
$useragnt = $_SERVER['HTTP_USER_AGENT']; //get  user agent
$ipaddrs = $_SERVER['REMOTE_ADDR']; //get ipaddress 
$filenameLog = "besog/" . date("Y-m-d") . "LOG.txt"; 
date_default_timezone_set('Europe/Copenhagen');
$infoToLog = $ipaddrs .  "\t" . $useragnt . "\t" . date('H:i:s') . "\n";
$file_arr = file($filenameLog);
$last_row = $file_arr[count($file_arr) - 1];
$arr = explode( "\t", $last_row);
$tidForSidsteLogLinje = strtotime($arr[2]);
$tidNu = strtotime(date('H:i:s'));

//write ip, useragent and time of page view to log file logfil, but only if the same visitor has not viewed the page within the last 10 seconds
if ($arr[0] == $ipaddrs and $arr[1] == $useragnt and $tidNu - $tidForSidsteLogLinje > 10){
    //write ip and user agent to textfile
    $file = fopen($filenameLog,  "a+");
    fwrite($file, $infoToLog); 
    fclose($file);

}
elseif ($arr[0] == $ipaddrs and $arr[1] == $useragnt and $tidNu - $tidForSidsteLogLinje < 10){
    die;
}
else {                      
    //Write ip and user agent to textfile
    $file = fopen($filenameLog,  "a+");
    fwrite($file, $infoToLog); 
    fclose($file);
    }
?>

Here are examples of the duplicate entries in the log (I have masked some of the ipaddresses):

xxx.x.95.240    Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko    12:52:33 
xx.xxx.229.91   Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36   12:52:45 
xx.xxx.229.91   Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36   12:52:45 
xxx.xx.154.83   ServiceTester/4.4.64.1514   12:53:03 
xxx.xx.91.126   Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/603.2.5 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.5   12:53:05 
xx.xxx.35.3 Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36  12:53:09 
xxx.xxx.130.34  Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko    12:53:56 
xxx.xxx.130.34  Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko    12:53:56 
xx.xxx.211.101  Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36  12:54:11 
x.xxx.54.4  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/601.6.17 (KHTML, like Gecko) Version/9.1.1 Safari/601.6.17  12:54:33

If my if-statements were working as intended, it should be possible to see duplicate lines in the entries like in the above.

How do I improve the code to eliminate these duplicate entries?

And help or suggestions is much appreciated!

Aucun commentaire:

Enregistrer un commentaire