Programowanie w języku PHP » FAQ

Licznik odwiedzin odporny na odświeżanie

  • 2008-03-24 11:29
  • 5 komentarzy
  • 6327 odsłon
  • Oceń ten tekst jako pierwszy
Wstęp

W tym artykule chciałbym poruszyć sprawę licznika odwiedzin który zlicza 1 osobę tylko raz, niezależnie od tego ile razy strona zostanie odświeżona. Skrypt będzie się opierać na cookies. Przy wejściu na stronę będzie sprawdzał czy na komputerze jest zapisane cookie. Jeśli jest, licznik nie zapisuje Twojej wizyty. Jeśli nie ma, skrypt zapisuje cookie, oraz zapisuje wizytę.

Sposób wykonania

Dla niewiedzących, do zapisywania cookie służy funkcja setcookie.

setcookie(nazwa, wartość, czas przechowywania na komputerze)


Oczywiście jest tam jeszcze trochę innych wiele wartości, ale nie będą nam potrzebne.
Wszystkie parametry oprócz nazwy są opcjonalne. Czas przechowywania jest datą wyrażoną w sekundach od 1 stycznia 1970 roku.

Teraz zabieramy się za licznik. Tworzymy dwa pliki: licznik.php i counter.n. Plik counter.n. zostawiamy pusty.

Wpisujemy teraz na początku pliku licznik.php:

<?
setcookie("visited", "1", time()+3600*3); 
 //Wysyła cookie na komputer użytkownika
?>


I koniecznie w następnych znacznikach kodu wpisujemy:

<?
if(file_exists("counter.n")) 
{
 //Sprawdza czy plik istnieje
   $file=fopen("counter.n", "r"); // otwiera plik
   flock($file, 1); // blokuje plik
    $ile=fgets($file, 100); 
 //Odczytuje wartość z pliku counter.n
 
   flock($file, 3); // odblokowywuje plik
    fclose($file); //zamyka plik
     if($_COOKIE["visited"]!="1") 
 //Sprawdza, czy użytkownik był na stronie
 {
$ile++; 
 //Zwiększa wartość o jeden tylko po pierwszym wejściu
 }
}
 else
{
$ile=1; //jeśli plik nie istnieje, wyświetli się 1
}
 
 $file=fopen("counter.n", "w"); // otwiera plik do zapisu
  flock($file, 2); // blokuje do zapisu
   fwrite($file, $ile); //zapisuje wartość
  flock($file, 3); // odblokowuje plik
 fclose($file); //zamyka plik
 
echo($ile); //Wyświetla wartość
?>


I to by było na tyle. Efekt możecie zobaczyć na stronie http://jarekx.110mb.com/4programmers/licznik.php

5 komentarzy

fourup 2011-04-17 19:43

Fajny skrypt. Prosty, funkcjonalny i do ogarnięcia przez początkujących.
Po drobnych modyfikacjach wykorzystałem go na swojej stronie: http://www.fourup.pl
Dziękuję.

Coldpeer 2008-03-26 01:33

Można zapisać to prościej (krócej) i zarazem wydajniej; dodatkowo kod odporny na niepoprawną zawartość pliku licznika:

$file = 'counter.n';
$ile = @file_get_contents($file) and is_numeric($ile) and $x = true or $ile = 1;
!$_COOKIE['visited'] and fwrite(fopen($file, 'w'), $x ? ++$ile : $ile);
setcookie('visited', true, time()+3600*3);
echo $ile;

W sumie dałoby się ładniej napisać, ale późno jest i mi się nie chce ;P

JarekX 2008-03-24 11:30

Już poprawione :)

reichel 2008-03-23 23:50

na oko moze to byc wina braku rozijania zmiennych powinno byc $_COOKIE["visited"] zamiast $visited.

AdamPL 2008-03-23 22:10

Przeprowadziłem mały test (1000 odwiedzin) i muszę z przykrością stwierdzić, że nie działa :D Oczywiście cookie mam włączone!