Programowanie w języku PHP » FAQ

Jak wyświetlić na stronie przybliżoną ilość osób on-line

  • 2006-06-20 12:09
  • 0 komentarzy
  • 1407 odsłon
  • Oceń ten tekst jako pierwszy
Poniższa funkcja zwraca tablicę, której pierwszym elementem jest
ilość wszystkich odwiedzin, drugim elementem jest ilość odwiedzin w
danym dniu natomiast trzeci element podaje przybliżoną ilość
użytkowników przeglądających stronę (on-line).
<?php
    function counter($t1=300,$t2=3600,$f="./counter.tmp"){
        global $HTTP_COOKIE_VARS; 
        $a=getenv("REMOTE_ADDR");
        $t=time();
        $p=fopen($f,"a+");
        flock($p,2);
        $h=array_pad(explode("|",chop(fgets($p,100))),4,0);
        while(!feof($p)){
            $e=explode("|",$m=chop(fgets($p,100)));
            if($e[1]>$t&&$e[0]!=$a)$b[]=$m;
        }        
        $b[]=$a."|".($t+$t1);
        $h[0]=count($b);
        if(!$HTTP_COOKIE_VARS["lastvisit"]){
            $h[1]++;
            $h[2]++;
            if($h[3]!=($d=date("d"))){
                $h[2]=1;
                $h[3]=$d;
            }
        }
        setcookie("lastvisit",1,$t+$t2);
        ftruncate($p,0);
        fputs($p,join("|",$h)."\n".join("\n",$b));
        flock($p,3);
        fclose($p);
        return array($h[1],$h[2],$h[0]);
    }
?>

Do funkcji wprowadzić można trzy opcjonalne parametry:
1. Czas przez jaki użytkownik jest traktowany jako obecny na stronie.
    - domyślnie jest to 300 sekund czyli 5 minut
    - parametr potrzebny do działania licznika on-line
2. Czas przez jaki licznik wszystkich odwiedzin nie zostanie podwyższony
przy np. przeładowaniu czy odświeżeniu strony.
    - wartość ta ustawia czas 'życia' cookie w przeglądarce
    - w przeglądarce z wyłączoną obsługą cookie mechanizm nie zadziała
3. Nazwa pliku przechowującego dane (domyślnie "./counter.tmp")
    - katalog ze skryptem musi mieć ustawione odpowiednie prawa do zapisu plików

Przykład użycia:

    $tab = counter();
    echo "Odwiedzin: $tab[0], Dzisiaj: $tab[1], On-line: $tab[2]";

Chciałem jeszcze zaznaczyć, że nie jestem pewien nieomylności tego rozwiązania.
Napisałem je dla własnych potrzeb i umieściłem w FAQ w celu podzielenia się
z innymi moimi spostrzeżeniami.