Оператор if — количество посещений веб-страницы подсчитывается несколько раз. Переполнение стека

Итак, есть проблема:

Я сделал несколько php-код для регистрации просмотров страниц (с большой помощью от переполнения стека). Я специально хочу не использовать куки для этого. Также я бы предпочел не использовать БД SQL, если это возможно, хорошо работающее решение без него.

Чтобы иметь дело с поведением браузера, таким как предварительная выборка и тому подобное, я пытаюсь отфильтровать дополнительные просмотры страниц с помощью функции 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 работали так, как задумано, в записях, как показано выше, должно быть возможно увидеть повторяющиеся строки.

Как мне улучшить код, чтобы устранить эти повторяющиеся записи?

И помощь или предложения высоко ценится!

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
}

Таким образом, Посетитель существует только один раз в вашем списке. Увидеть вставить игнорировать для большего.

Теперь вы можете легко сделать другую функцию для сохранения страниц, которые посещает пользователь.
В сценарии, который получает каждый раз, когда вы выполняете:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]