[PHP] Jak wykryć i pokazać liczbę osób oglądających aktualnie stronę WWW?
Chcesz pokazać na swojej stronie liczbę osób, które aktualnie przeglądają serwis WWW.
Komponent, pokazujący ile osób przegląda aktualnie Twoje strony WWW, przydaje się aby sprawdzić czy w określonym czasie liczba użytkowników przebywających online jest duża. Za pomocą prostego skryptu możesz poinformować innych użytkowników, jak kształtuje się odwiedzalność serwisu w określonych godzinach.
Ponieważ liczbę osób przebywających w serwisie można szacować na wiele sposobów, musimy wybrać taki, który będzie pokazywał wynik najbliższy prawdzie. Proponuję ustalić liczbę odwiedzających na podstawie ich adresów IP.
Możnaby wykorzystać również cookies, albo technikę mieszaną (cookies i IP), jednak komplikuje to nieco skrypt. W praktyce numer IP dosyć wiernie oddaje faktyczną (choć zawsze tylko przybliżoną) ilość odwiedzających aktualnie serwis i w zupełności wystarczy do naszych zastosowań. W przeciwieństwie do cookies numer IP zawsze jest dostępny, nawet jak użytkownik ma ciasteczka wyłączone.
Oto kod programu do zliczania i pokazywania liczby osób przebywających aktualnie na stronie:
<?
$minut=20;
$teraz=time()+60*$minut;
$bazaip = file("ip.txt");
$ile=count($bazaip);
$ip = $_SERVER["REMOTE_ADDR"];
for ($i=0;$i<$ile;$i++) {
$pol = explode("`",$bazaip[$i]);
if ($pol[2]<time()) {$bazaip[$i]="";}
if ($pol[1]==$ip) {
$bazaip[$i]="`$ip`$teraz`\n"; $jest=1;
}
}
if ($jest<>1) $bazaip[]="`$ip`$teraz`\n";
$f = fopen("ip.txt","w");flock($f,2);
for ($i=0;$i<$ile+1;$i++) {
if ($bazaip[$i]<>"") { fwrite($f, $bazaip[$i]); $ileip++;}
}
flock($f,3); fclose($f);
echo $ileip;
?>
Zliczanie numerów IP musi odbywać się w określonym czasie. Nie może on być ani zbyt krótki, ani zbyt długi. Zakładam, że średnio użytkownik przebywa w serwisie ok. 20 minut (zmienna $minut). Oznacza to, że jeżeli po 20 minutach użytkownik nie przeładuje strony, nie jest już zliczany jako będący online na naszej stronie. Wartość tą trzeba dobrać eksperymentalnie. Jeżeli ustawisz ją na godzinę, znacznie zawyżysz ilość odwiedzających ponieważ będziesz zliczać osoby, które nie są aktywne od 59 minut.
W pliku ip.txt będą przechowywane adresy IP użytkowników. Musi on mieć prawa do zapisywania dla każdego (chmod 666). Jeżeli skrypt ma być wykorzystany na wielu stronach, ścieżka do tego pliku musi być bezwzględna, np. /home/httpd/www/pliki/ip.txt
Pierwsza pętla for() odczytuje wszystkie numery IP z pliku, umieszcza je w tabeli $bazaip[] i sprawdza czy IP użytkownika (pobrane wcześniej ze zmiennej $_SERVER["REMOTE_ADDR"]) jest już w tabeli. Jeżeli jest, dla tego IP ustawiony zostaje czas powiększony o 20 minut, przez które użytkownik będzie brany pod uwagę przy zliczaniu IP.
Jeżeli jakieś IP przekroczyło limit minut zostaje skasowane z tabeli, a dokładniej - komórkę tabeli wypełnia pusta wartość. Jeżeli IP aktualnego użytkownika nie występuje w tabeli zostaje dodane zaraz za pętlą, po sprawdzeniu warunku $jest<<1.
Następnie plik z numerami IP otwierany jest do zapisu i umieszczane są w nim wszystkie numery IP, które nie przekroczyły założonego limitu czasu. Plik ma zakładaną blokadę zapisu funkcją flock(), aby kilka osób w tym samym czasie nie mogło do niego zapisywać.
Po dopisaniu aktywnych numerów IP ich liczba zostaje wypisana na ekran. W ten sposób można pokazać ile numerów IP (teoretycznych osób) było aktywnych na stronie przez ostatnie 20 minut.
Pamiętaj, że jedno IP nie musi oznaczać jednej osoby. Ten sam użytkownik modemu gdy połączy się dwa razy z numerem dostępowym, może za każdym razem otrzymać inny numer IP. Jeżeli w ciągu 20 minut coś go rozłączy i ponownie wejdzie na stronę, będzie odnotowany pod dwoma numerami IP. Z kolei niektóre firmy lub uczelnie mają jeden numer IP, którym posługuje się wiele osób...
Jak widzisz, nie można dokładnie określić liczby osób, jednak w praktyce okazuje się, że liczba IP prawie zawsze odpowiada liczbie osób na niewielkich witrynach. Bardziej zaawansowany skrypt mógłby dodatkowo wykorzystywać cookies, aby jeszcze dokładniej wyliczyć faktyczną liczbę użytkowników przebywających aktualnie na stronie, ale wciąż nie byłby to wynik w 100 proc. dokładny.