статистика посещений

antson

Новичок
Партнер клуба
Фанат
Может его все таки больше интересует как опознать бота ?
Писал я счетчик уникальных посетителей. так вот
боты все лафу портили. Я для чела в сесии ставил переменную, что он засчитан, сажал куку, что он уже был у меня.
А как боты свински себя ведут в этом плане объяснять не нужно.
Вот пришлось по user-agent отсекать их от подсчета.
Учитывая что известных поисковиков больше 200
и сравнивать по полному списку накладно, попытался выделить признаки $bots.

Вообщем критикуйте, дополняйте .


global $HTTP_SERVER_VARS;
$agent = strtoupper($HTTP_SERVER_VARS["HTTP_USER_AGENT"]);
// признаки ботов или конкретные их имена (в верхнем регистре)
$bots=array("HTTP","BOT","SPIDE","CRAWL","YANDEX","APORT","RAMBLER","SEARCH","SEEK","SITE");
$botsCount=count($bots);

$isBot=0;
for($i=0;$i<$botsCount;$i++){
if(strpos($agent,$bots[$i])!==false){
$isBot=1; $i=99999; //закончили цикл присвоев переменной значение больше чем ботов в массиве
}
}
return ($isBot==1?'bot':'user');
 

moxnatiy

Новичок
$HTTP_SERVER_VARS - устарело
PHP:
if(strpos($agent,$bots[$i])!==false){
   $isBot=1; 
   /*
   $i=99999; //закончили цикл присвоев переменной 
   значение    больше чем ботов в массиве
   */
   break;
}
 

Фанат

oncle terrible
Команда форума
Я для чела в сесии ставил переменную,
ещё один. любитель.
о! мало нам сессий. будем ещё и куку ставить.
Учитывая что известных поисковиков больше 200
и что - все они к тебе ходят толпами и чудовищно портят статистику?
ты себе льстишь. Ходит к тебе от силы десяток. А остальные портят статистику меньше, чем диалапщик с отключёнными куками.

Но давай, разберём твою функцию
ты в каком веке её писал? Про $_SERVER не слышал?

хвалю.
при незнании оператора break - неплохое решение.
но на будущее порекомендую array_search
функциия такая состоит из двух строчек:
$bots=array();
return aray_search($_SERVER["HTTP_USER_AGENT"],$bots);
 

Фанат

oncle terrible
Команда форума
antson
кстати, на будущее.
$isBot=1; $i=99999;}
}
return ($isBot==1?'bot':'user');

заменяется одной строчкой:
return 1;
поскольку return завершает выполнение функции.
 

Кром

Новичок
но на будущее порекомендую array_search
функциия такая состоит из двух строчек:
$bots=array();
return aray_search($_SERVER["HTTP_USER_AGENT"],$bots);
Это что из себя будеть представлять список $bots, если искать таким образом? :)
 

SelenIT

IT-лунатик :)
Лично я когда-то решал подобную задачу одной регуляркой:
PHP:
$is_bot = preg_match(
   '/bot|slurp|seek|finder|lycos|rambler|yand|spider|crawler|gulliver|all\.by|fast/i',
   $_SERVER['HTTP_USER_AGENT']);
Возможно, она уже остала от жизни - давненько не проверял...

Как вариант без регулярок и циклов - сравнение исходного User-agent'а и результата замены (str_replace) в нем массива "признаков" ботов на пустую строку... но имхо это изврат.
 

antson

Новичок
Партнер клуба
Фанат

вообщето я перед постом выкинул
ветку по
if($isBot==0){
// обработка посетителя для счетчика
}

А так уж если делать функцию, то

function CheckBot(){
global $HTTP_SERVER_VARS;
$agent = strtoupper($HTTP_SERVER_VARS["HTTP_USER_AGENT"]);
// признаки ботов или конкретные их имена (в верхнем регистре)
$bots=array("WWW","HTTP","BOT","SPIDE","CRAWL","YANDEX","APORT","RAMBLER","SEARCH","SEEK","SITE");
$botsCount=count($bots);

for($i=0;$i<$botsCount;$i++){
if(strpos($agent,$bots[$i])!==false){
return 1;
}
}


return 0;
}

и переменная isBot вообще не нужна

Для оптимальности функции надо отражировать массивчик
$bots по частоте заходов ботов.

Кто поможет статистикой от своего сайта.
user_agent, hits за год или больше от сайта , который в сети пру лет минимум.
 

antson

Новичок
Партнер клуба
join('',file()) - это то что делала та функция

а стандартный
$temp=file2string($file); //функция чтения файла как строки
$buffer=explode("\n",$temp);
получается
$buffer=file();

все равно быстрее.
текст функции file2string
http://forum.dklab.ru/php/advises/TheSearchRobot.html
 

Фанат

oncle terrible
Команда форума
чувак.
ты что-то путаешь.
если тебе нужна строка, то при чём тут explode("\n",?

определись, а потом продолжим.

Заодно, кстати, я тебя в отдельную тему вынесу, а то о бедном авторе топика все забыли
 

SelenIT

IT-лунатик :)
join('',file()) вообще-то называется [m]file_get_contents[/m] :)

А вот почему fread(..., filesize(...)) быстрее file_get_contents, если в мануале открытым текстом рекомендован второй вариант - кто-нибудь может объяснить или ткнуть в доку? Как я понял, теперь оба варианта binary-safe, так что это уже не аргумент...
 

antson

Новичок
Партнер клуба
вот сравнил несколько вариантов
<?
function CheckBot($agent){
$bots=array("HTTP","BOT","SPIDE","CRAWL","YANDEX","APORT","RAMBLER","SEARCH","SEEK","SITE");
$botsCount=count($bots);
for($i=0;$i<$botsCount;$i++){
if(strpos($agent,$bots[$i])!==false){ // 1962.065 ms
return 1;
}
}
return 0;
}


function CheckBot2($agent){
return preg_match('/HTTP|BOT|SPIDE|CRAW|YANDEX|APORT|RAMBLER|SEARCH|SEEK|SITE/i',$agent);
}

function CheckBot3($agent){
$bots=array("HTTP","BOT","SPIDE","CRAWL","YANDEX","APORT","RAMBLER","SEARCH","SEEK","SITE");
return preg_match('/'.implode('|',$bots).'/i',$agent);
}


// для тестов будет формировать строки агента сами
$bots=array("HTTP","BOT","SPIDE","CRAWL","YANDEX","APORT","RAMBLER","SEARCH","SEEK","SITE");
$botsCount=count($bots);
$s1=0; $s2=0; $s3=0;
for($i=0;$i<$botsCount;$i++){
$agent= 'bla-bla-bla-bla-bla-'.$bots[$i].'-bla-bla-bla-bla-';
for($j=0;$j<10000;$j++){
$s1+=CheckBot($agent);
$s2+=CheckBot2($agent);
$s3+=CheckBot3($agent);
}
}
echo $s1.','.$s2.','.$s3;


include "profiler.php";

?>

поиск по массиву проиграл остальным

CheckBot1 - 3965.6152 ms
CheckBot3 -2767.2894
а идея мне нравилась автоматом строить регулярку. :(
CheckBot2 1294.0187
 

antson

Новичок
Партнер клуба
в оригинальном треде кинул замеры производительности.
мля не ожиданные выводы.
strpos проиграл preg_match()
я в шоке
 

Фанат

oncle terrible
Команда форума
не в оригинальном, а в чужом.
в который ты влез и замусорил своими откровениями.
 
Сверху