Klasyka PHP – licznik odwiedzin
Dlaczego klasyka? Gdyż to chyba jeden z najpopularniejszych skryptów o jakich myśli każdy początkujący programista PHP. Fakt faktem, że przy dzisiejszych usługach typu Google Analytics jest to mało komfortowe rozwiązanie i nie dostarcza wielu informacji, nie mniej na pewno dużo satysfakcji
.
Bez zbędnego przedłużania przechodzimy do sedna sprawy. Nasz licznik będzie maksymalnie uproszczony – będzie zliczał każde przeładowanie strony. Aby zbytnio się nie napracować skorzystamy z funkcji file_get_contents oraz file_put_contents do przechowania aktualnego stanu licznika w pliku.
Jak działa zatem prosty licznik? Pobiera z pliku ilość odsłon, dodaje 1, zapisuje i wyświetla aktualny stan.
$fn = 'data.txt'; $counter = (file_exists($fn) ? (int)file_get_contents($fn) : 0) + 1; file_put_contents($fn, $counter);
I to już w zasadzie wszystko. Pierwsza linia określa nazwę pliku danych licznika. Druga odczytuje jego aktualny stan, o ile plik istnieje. Ostatnia zapisuje ponownie ilość osłon do pliku. W zmiennej $counter znajduje się ich aktualna ilość którą możemy umiejscowić gdzieś na stronie:
echo $counter;
Nasz licznik jest już gotowy. Cały kod możesz pobrać tutaj.
Dla ambitnych
Jeśli nie chcesz aby licznik zliczał każdą pojedynczą odsłonę, a jedynie użytkowników, to musimy pokusić się o skorzystanie z cookies (ciasteczek) przeglądarki.
Podobnie jak w przykładzie wyżej, nie jest to jakiś skomplikowany mechanizm i łatwo go obejść, ale spełnia swoje zadanie w minimum jakie od niego wymagamy.
$fn = 'data.txt';
$counter = file_exists($fn) ? (int)file_get_contents($fn) : 0;
$cookiename = 'simple_counter_d3v8';
if ( ! isset($_COOKIE[$cookiename]))
{
file_put_contents($fn, ++$counter);
setcookie($cookiename, '1', time()+60*60*24);
}
Jeśli użytkownik odwiedzi stronę, zapisujemy w jego przeglądarce ciasteczko. Przy kolejnej odsłonie tylko wtedy podwyższamy wartość licznika jeśli owo ciasteczko nie istnieje. Po 24h, odsłona tego samego użytkownika jest ponownie zliczana – można to regulować zmieniając liczbę sekund w trzecim parametrze funkcji setcookie.
Kompletny kod można pobrać tutaj.
Przechodzimy do sedna sprawy
taki mały błąd
Dzięki, poprawione.
Problem pojawi się przy wielu wykonaniach naraz. Licznik będzie się resetował. Koniecznie dołóż flagę LOCK_EX
Faktycznie, myślałem że file_put_contents to załatwia w opozycji do fopen/fwrite :\