Ruch przychodzący w PHP

W tym artykule zajmiemy się analizowaniem ruchu przychodzącego. Napiszemy prosty skrypt, który sprawdzi kto i z jakiego kraju nas odwiedza oraz jakie artykuły czyta. Sprawdzimy również ilość unikalnych użytkowników.

Do odczytywania danych o użytkowniku możemy posłużyć się zmienną globalną $_SERVER, która zawiera różne informacje dotyczące zarówno serwera jak i użytkownika:

  • jaki ma adres IP
  • z jakiej strony do nas przyszedł
  • z jakiej przeglądarki korzysta

Adres IP

Aby korzystać z Internetu musimy posiadać tzw. adres IP. To jest specjalny numer, która identyfikuje nasz komputer (komunikacja w sieci odbywa się dwustronnie – odbierasz coś i wysyłasz – stąd potrzeba posiadania takiego adresu).

Adres IP może być stały lub zmienny (najczęściej) co oznacza, że użytkownicy co jakiś czas otrzymują nowy. Dzieje się tak zwykle w przypadku restartowania połączenia (jak korzystamy z routera w domu do łączenia się z Internetem to adres ten zmieni się jak wyłączymy i włączymy ponownie urządzenie – choć nie jest to regułą). Mimo tych niedogodności, wielu użytkowników ma ten sam adres IP przez sporą ilość czasu.

Informację o adresie IP użytkownika znajdziemy w zmiennej globalnej $_SERVER['REMOTE_ADDR'].

Mając te dane, możemy je podpiąć do kodu strony i zapisywać w bazie dzięki czemu ustalimy:

  • jak wielu nowych użytkowników nas odwiedza
  • jakie artykuły czytają
  • jak często użytkownicy wracają

Korzystając z zewnętrznych baz, możemy ustalić do jakiego operatora należy dany adres IP i tym samym mniej więcej odkryć lokalizację użytkownika.

Ciasteczka – Cookies

Ciasteczka to niewielkie pliki na komputerze użytkownika tworzone przez stronę internetową, którą odwiedził. Odwiedzający ma ograniczoną ilość maksymalną ciasteczek, ponadto może je usunąć lub wyłączyć. Jeżeli korzystamy z tego mechanizmy to naszym obowiązkiem jest poinformowania o tym użytkownika, który dodatkowo musi wyrazić zgodę. Tak się dzieje jak korzystamy z np. Google Analytics.

Jeżeli chodzi o śledzenie to zapisywanie informacji w ciasteczkach pozwala uniknąć często problemu z adresem IP, bo informację o tym że już nas ktoś odwiedził wyczytamy właśnie z tego pliku.

<?php
if (!isset ($_COOKIE['my_cookie_name']) ) {
    echo 'Witaj nowy użytkowniku!';

} else {
    $last_visit = date ('Y-m-d H:i', $_COOKIE['my_cookie_name']);
    echo "Witaj ponownie. Ostatni raz odwiedziłeś nas $last_visit";
}

$last_visit = time();
$cookie_expire = time() + (86400 * 30);
setcookie ('my_cookie_name', $last_visit, $cookie_expire, '/');

Sprawdzamy czy istnieje już ciasteczko o nazwie my_cookie_name na komputerze użytkownika (czy zmienna globalna $_COOKIE jest uzupełniona). Jeżeli tak to znaczy, że użytkownik wcześniej nas odwiedził. Pobieramy zawartość zmiennej. Na końcu ustawiamy ponownie ciastko przy użyciu setcookie w której ustawiamy:

  • nazwę ciasteczka
  • wartość – tutaj bieżąca data i godzina
  • maksymalny czas jaki ciastko będzie na komputerze
  • adres w domenie, którego dotyczy ciastko – podanie '/’ oznacza – wszystkie strony w domenie

Odwiedziny

Uzbrojeni w tą wiedzę zajmiemy się zliczaniem odwiedzin i zapisywaniem ich w bazie danych SQLite. O tym jak korzystać z SQLite napisałem w osobnym artykule – Skrypt w PHP korzystający z bazy SQLite. Dodam tylko, że taką bazę lepiej trzymać w niedostępnym miejscu.

$db = new SQLite3( 'analytics.db' );
$query = 'CREATE TABLE events
          ip INT,
          page VARCHAR(255),
          created TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
$db->exec( $query );

Powyżej stworzyliśmy bazę w pliku o nazwie analytics.db, Utworzyliśmy również tabelę events w której przechowujemy

  • adres IP – dostępne w $_SERVER['REMOTE_ADDR']
  • aktualną stronę – dostępne w $_SERVER['REQUEST_URI']
  • automatyczną datę dodania rekordu

Pobranie adres IP i zapisanie go w bazie, możemy zrealizować następująco:

$ip = ip2long ( $_SERVER['REMOTE_ADDR'] );
$url = $_SERVER['REQUEST_URI'];

$query = "INSERT INTO events (ip, page) VALUES ($ip, '$url')";
$db->exec( $query );

Adres IP zamieniamy na liczbę za pomocą funkcji ip2long (funkcja, która odwraca zamianę to long2ip) W dalszej kolejności dodajemy adres IP oraz adres strony na której jest wywoływany skrypt.

Aby zliczyć odwiedziny możemy wykorzystać proste zapytania SELECT

-- liczba wszystkich odwiedzin
SELECT COUNT(*) FROM events

-- liczba wszystkich unikatowych odwiedzających
SELECT COUNT(IP) FROM events

-- dzienna liczba unikatowych odwiedzających
SELECT COUNT(IP) AS visitor, STRFTIME("%m-%Y-%d", created) AS date FROM events 
GROUP BY STRFTIME("%m-%Y-%d", created)

-- liczba odwiedzin konkretnych stron
SELECT COUNT(page) AS page_count FROM events
GROUP BY page

Lokalizacja

Znając adres IP sprawdzimy lokalizację użytkownika. Skorzystamy przy tym z baz oferowanych przez stronę ip-api.com. Firma udostępnia darmowe API dla celów niekomercyjnych.

$data_raw = file_get_contents ( "http://ip-api.com/json/$ip" );
$data = json_decode ($data_raw, true);
$country = $data['country'];

Odpowiedź otrzymamy w formacie json. Przekształcamy ją na tablicę za pomocą wbudowanej w PHP funkcji json_decode. Poniżej przykład odpowiedzi pobrany z powyższej strony.

{
  "query": "24.48.0.1",
  "status": "success",
  "country": "Canada",
  "countryCode": "CA",
  "region": "QC",
  "regionName": "Quebec",
  "city": "Montreal",
  "zip": "H2L",
  "lat": 45.5212,
  "lon": -73.5524,
  "timezone": "America/Toronto",
  "isp": "Le Groupe Videotron Ltee",
  "org": "Videotron Ltee",
  "as": "AS5769 Videotron Telecom Ltee"
}

Należy oczywiście pamiętać, że zwracane dane są orientacyjne i sugerowanie się nimi w przypadku miasta nie zawsze się sprawdzi (szczególnie w przypadku Polski).

Strona przekierowująca

Informacje o stronie przekierowującej znajdują się w $_SERVER['HTTP_REFERER']. Niestety ta zmienna nie zawsze jest uzupełniana przez przeglądarki.

if (isset ($_SERVER['HTTP_REFERER']) ) 
    $referer = $_SERVER['HTTP_REFERER'];
else
    $referer = '';

Podsumowanie

  1. Adres IP użytkownika przechowywany jest w zmiennej globalnej $_SERVER['REMOTE_ADDR'].
  2. Ciasteczka odczytujemy sprawdzając zmienną $_COOKIE, a zapisujemy za pomocą setcookie.
  3. Aktualnie odwiedzana strona znajduje się w $_SERVER['REQUEST_URI']
  4. Adres IP możemy zamienić na liczbę korzystając z funkcji ip2long, natomiast liczbę na IP za pomocą long2ip
  5. Aby sprawdzić pochodzenie adresu, możemy skorzystać z zewnętrznych firm, które oferują geolokalizację po adresie IP.
  6. Adres strony z jakiej przyszedł użytkownik, sprawdzimy w zmiennej globalnej $_SERVER['HTTP_REFERER'].