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