访问网页计数多次PHP

时间:2017-05-23 11:15:12

标签: php if-statement logfile

所以有问题:

我已经制作了一些PHP代码来注册页面视图(在堆栈溢出的帮助下有很多帮助)。我特别想避免使用cookies。另外,如果没有它,那么我宁愿不使用SQL DB。

为了处理预取等浏览器行为,我试图用if,elseif,else函数过滤掉额外的页面视图。

实际上的问题是,有时候的综合浏览量会被写入日志文件两次,或者if语句和其余代码存在时间问题。

这是我的代码:

<?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);
    }
?>

以下是日志中重复条目的示例(我已经屏蔽了一些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语句按预期工作,则应该可以在条目中看到重复的行,如上所述。

如何改进代码以消除这些重复的条目?

非常感谢帮助或建议!

1 个答案:

答案 0 :(得分:0)

我们在系统中使用复杂的网站访客跟踪/日志系统。 我建议您将此值存储在数据库中,并将IP地址字段设置为唯一。

您可以设置类似

的CookieID
Cookie::set('__id', time());

并且像

一样
if (isset($_COOKIE['__id'])){

        //With mysql you go like
        $db->Execute("INSERT IGNORE INTO VisitorTable(hash, ip,..) 
       VALUES($_COOKIE['__id'],$_SERVER['REMOTE_ADDR'] )" // the HTTP_USER_AGENT refferer all kind of information that you wannt to store
        }

这样,访问者只在列表中存在一次。有关详情,请参阅insert ignore

现在,您可以使用其他功能来保存用户访问的页面。 在每次执行的脚本中,你都会这样:

$db->Execute("INSERT INTO VisitorActivity (visitorID,page....) VALUES ($_COOKIE['__id'],$_Server['..'])" );