This webpage has been robot translated, sorry for typos if any. To view the original content of the page, simply replace the translation subdomain with www in the address bar or use this link.

Как узнать, откуда пришли посетители

Повесив на свой сайт счётчики я вдруг обнаружил, что не одна из организаций, мне их предоставивших, не позволяет посмотреть, по какому запросу в Яндексе (и других поисковиках) тот или иной человек пришёл на мой сайт. По крайней мере, никто не предоставляет такую услугу бесплатно.

Тогда я обиделся на них за то, что мне, в таком случае, придётся самому писать себе небольшой логгер. Задачка - легчайшая, потому и ломало её делать. Однако хозяева всяких сайтов-счётчиков имеют наглость брать за это деньги, вселяя в людей веру, что свои деньги бурт не зря. Что ж, развеем их надежды нас поиметь!

Страница, с которой пришли

Итак, получить страницу, с которой пользователь попал на эту, - легче лёгкого. Её адрес по умолчанию передаётся в заголовке HTTP-запроса пользователя в строке "Referrer:". Получить её значение из PHP можно, вызвав соответствующую функцию следующим образом:

getenv("HTTP_REFERER")

Так что, в принципе, можно просто взять и написать отдельную функцию, которая:

$H=getenv("HTTP_REFERER"); // получает URL, с которого пришёл посетитель 
$f=fopen("mylog.log",'a'); // открывает файл с логами на добавление 
flock ($f,2);      // запрещает к нему доступ до тех пор, 
                   //пока он не будет закрыт (на случай, если два 

                   //скрипта захотят одновременно записать что-то 
                   //в файл, одному из них придётся подождать) 
fwrite($f,"$H\n"); // пишет в файл полученный тремя строчками выше URL 
fclose($f);        // закрывает файл

Потом эту функцию можно вызывать в начале какждого php-скрипта страничек сайта.

Как узнать ip, свою судьбу и точное время

Но! Раз уж мы тут, можно немного доработать функцию, чтобы узнать IP посетителя (по нему можно примерно прикинуть область, где он находится физически), его браузер (интересно же) и страничку, куда он, собственно пришёл (звучит немного странно - мы ж и так знаем, что пришёл он на нашу страничку; но представьте, что у вас эту функция вызывается в участке заголовочного кода, который одинаково вставляется во все ваши странички, - а так, пожалуй, вы и сделаете). Также неплохо бы иметь время, когда чел пришёл к нам на сайт - потом можно будет проанализировать активность пользователей и т.п.

Так что, функция примет следующий вид:

$er_time=date("H:i:s d M Y"); // записываем текущее время в строку, 
    //используя заданный формат 
$U=getenv("HTTP_USER_AGENT"); // получаем данные о софте, 

    //который испольует пользователь 
$H=getenv("HTTP_REFERER"); // получаем URL, с которого пришёл посетитель 
$R=getenv("REMOTE_ADDR"); // получаем IP посетителя 
$W=getenv("REQUEST_URI"); // получаем относительный адрес странички, 
    //которую запросил посетитель 
$f=fopen("logs/visits.log",'a'); // дальше - понятно, пишем всё это в файл 
flock ($f,2); 
fwrite($f,"$er_time\n Br: $U\n Rf: $H\n IP: $R\n Rq: $W\n"); 
fclose($f);

Но и эта функция далека от совершенства! Дело в том, что русских символов вы в этих урлах не увидите - их будут заменять их 16-ричные представления (предваряемые знаком "%"). Поэтому неплохо бы, чтобы скрипт самостоятельно приводил их к удобочитаемому виду: заменял всякие

http://www.yandex.ru/yandsearch?text=%E9%EE%E6%FB%E3+%F4%F2%F3%EC%E0%ED%E5&stype=www

на

http://www.yandex.ru/yandsearch?text=йожыг+фтумане&stype=www

Делать мы это будем следующим куском кода с использованием регулярных выражений:

while (ereg('%([0-9A-F]{2})',$H)){ // пока в строке $H будет хоть одно 
        //сочетание знака % и двух символов из диапазонов 0-9 и A-F 

        //(шестнадцатиричные цифры) 
    $val=ereg_replace('.*%([0-9A-F]{2}).*','\1',$H); 
        // присваиваем $val результат замены выражения, 
        //содержащего процент и два символа из означенных выше интервалов, 
        //на эти самые два символа 

        // короче говоря, теперь в $val у нас очередные 2 символа, 
        //перед которыми в исходном выражении стоял процент 
    $newval=chr(hexdec($val)); // получаем сивол с номером, 
        //полученным переведением полученного в $val 
        //шестнадцатиричного числа в "нормальное" 

    $H=str_replace('%'.$val,$newval,$H); 
        //стандартная строковая функция замены - 
        //заменяет подстроку, состоящую из процента и друх символов 
        //из переменной $var на символ, который эти два 
        //шестнадцатиричных символа кодировали 

    }// конец цикла :)

Итого:

$er_time=date("H:i:s d M Y"); // записываем текущее время в строку, 
    //используя заданный формат 
$U=getenv("HTTP_USER_AGENT"); // получаем данные о софте, 
    //который испольует пользователь 
$H=getenv("HTTP_REFERER"); // получаем URL, с которого пришёл посетитель 
$R=getenv("REMOTE_ADDR"); // получаем IP посетителя 
$W=getenv("REQUEST_URI"); // получаем относительный адрес странички, 

    //которую запросил посетитель 

while (ereg('%([0-9A-F]{2})',$H)){ // пока в строке $H будет хоть одно 
        //сочетание знака % и двух символов из диапазонов 0-9 и A-F 
        //(шестнадцатиричные цифры) 
    $val=ereg_replace('.*%([0-9A-F]{2}).*','\1',$H); 
        // присваиваем $val результат замены выражения, 

        //содержащего процент и два символа из означенных выше интервалов, 
        //на эти самые два символа 
        // короче говоря, теперь в $val у нас очередные 2 символа, 
        //перед которыми в исходном выражении стоял процент 
    $newval=chr(hexdec($val)); // получаем сивол с номером, 

        //полученным переведением полученного в $val 
        //шестнадцатиричного числа в "нормальное" 
    $H=str_replace('%'.$val,$newval,$H); 
        //стандартная строковая функция замены - 

        //заменяет подстроку, состоящую из процента и друх символов 
        //из переменной $var на символ, который эти два 
        //шестнадцатиричных символа кодировали 
    }// конец цикла :) 

$f=fopen("logs/visits.log",'a'); // дальше - понятно, пишем всё это в файл 
flock ($f,2); 
fwrite($f,"$er_time\n Br: $U\n Rf: $H\n IP: $R\n Rq: $W\n"); 
fclose($f);

Уже по логам этого скрипта можно судить, откуда пришёл посетитель, по каким страничкам он прошёл и на какой страничке покинул сайт. Да, безусловно, можно было это сделать и сессиями - но нам лень. А так - 2 минуты, и можно наслаждаться! :)

Ты узнаешь её из тысячи

Это - основа. Дальше можно много чего придумать: например, из строк, содержащих "http://www.yandex.ru/yandsearch", вырезать ту часть, в которой, собственно, содержится запрос, и записывать в какой-нибудь файл типа "yandex.log". В общем, на что фантазии хватит - всё можно забабахать!


Created/Updated: 25.05.2018

';>