This page has been robot translated, sorry for typos if any. Original content here.

Як дізнатися, звідки прийшли відвідувачі

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

Тоді я образився на них за те, що мені, в такому випадку, доведеться самому писати собі невеликий логгер. Завдання - найлегша, тому і ламало її робити. Однак господарі всяких сайтів-лічильників мають нахабство брати за це гроші, вселяючи в людей віру, що свої гроші бурт не дарма. Що ж, розвіємо їх надії нас поиметь!

Сторінка, з якої прийшли

Отже, отримати сторінку, з якої користувач потрапив на цю, - легше легкого. Її адреса за замовчуванням передається в заголовку 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: sd 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 і AF 
 // (шістнадцяткові цифри) 
 $ 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: sd 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 і AF 
 // (шістнадцяткові цифри) 
 $ 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 ". Загалом, на що фантазії вистачить - все можна забабахати!