Licznik odwiedzin w PHP

Licznik w PHP (nieco rozbudowany)

Ostatnio postanowiłem ulepszyć mój licznik tekstowy na stronie www o funkcję zliczania dziennego - tzw. licznik dzienny. Szukałem trochę w Internecie, znalazłem parę skryptów, ale niestety wszystkie posiadały jakieś niedoskonałości. Postanowiłem napisać taki licznik samodzielnie, oto jego kod źródłowy. Licznik wyświetla wszystkie odwiedziny strony oraz liczbę odwiedzin dzisiaj i wczoraj. Pierwsza część licznika - czyli ogólny licznik zliczający wszystkie odwiedziny to popularny skrypt, który lekko przerobilem. Druga część - licznik dzienny jest w całości moją pracą. Aby licznik działał dobrze należy umieścić na serwerze w folderze głównym pliki licznik.txt o zawartości 0; oraz dzienny.txt o zawartości np 2006-02-13:0:2006-02-12:0. Oba pliki muszą mieć prawa dostępu (CHMOD) 666. Licznik jest odporny na przeładowania strony, odwiedziny są zliczane raz na dobę.
Proszę o komentarze i oceny :) Jest to mój pierwszy artykuł na 4programmers.

<?php
function polnoc() /* odmierza ile sekund od danej chwili jest do konca dnia*/
{
   $teraz = date("H:i:s");
   $czas = explode(":", $teraz);
   $godziny = 23-$czas[0];
   $minuty  = 59-$czas[1];
   $sekundy = 59-$czas[2];
   $waznosc = $godziny*3600 + $minuty*60 + $sekundy;
   return $waznosc;
}

        if((!isset($_COOKIE['licznik'])) && (!strstr($_SERVER['HTTP_REFERER'], "www.nazwa-strony.pl")))
        {
               
                $plik = fopen("licznik.txt", "r");
                $tekst = fread($plik, filesize("licznik.txt"));
                $dane = explode(";", $tekst);
                fclose($plik);
                $plik = fopen("licznik.txt", "w");
                flock($plik, 2);
                $dane[0]++;
                fwrite($plik, "$dane[0];", 15);
                flock($plik, 3);
                fclose($plik);
               
         /*LICZNIK DZIENNY - MADE BY WOWO */
        $data = date("Y-m-d"); /*zmienna przechowująca dzisiejszą datę*/
        $dzienny=fopen("dzienny.txt","r"); /*otwieramy plik, plik jest formatu yyyy-mm-dd:liczba:yyyy-mm-dd:liczba, gdzie pierwsza data jest data dzisiejsza, pierwsza liczba liczbą odwiedzin dzisiaj, druga data, to data wczorajsza, druga liczba to liczba odwiedzin wczoraj*/
        $dzienny_tekst =fread($dzienny, filesize("dzienny.txt")); /*czytamy caly plik do zmiennej dzienny_tekst*/
        $dane2 = explode(":", $dzienny_tekst); /*rozbijamy wczytany tekst z pliku, na daty i liczby klikniec - calosc bedzie w tabeli*/
        fclose($dzienny); /*zamykamy plik, ktory otwarlismy tylko do odczytu*/
       
        if($dane2[0]==$data) /*jesli w pierwsza data w pliku jest data dzisiejsza to dzialamy jak nizej*/
      { $dane2[1]++; /*zwiekszamy liczbe klikniec dzisiaj*/
                $dzienny=fopen("dzienny.txt","w"); /*otwieramy plik do zapisu*/
                flock($dzienny, 2); /* blokujemy plik przed zapisem*/
                fwrite($dzienny, "$dane2[0]:$dane2[1]:$dane2[2]:$dane2[3]", 30); /*zapisujemy calość do pliku */
          flock($dzienny, 3); /* odblokowujemy plik */
          fclose($dzienny);   /* zamykamy plik */
        }
        else/* jeśli pierwsza data w pliku nie jest dzisiejszą datą */
        { $dane2[2]=$dane2[0]; /* druga date w pliku ustawiamy, ta ktora byla do tej pory pierwsza*/
          $dane2[3]=$dane2[1]; /* druga liczbe odwiedzin ustawiamy, ta ktora byla do tej pory pierwsza*/
          $dane2[0]=$data; /* ustawiamy pierwsza date w pliku na date dzisiejsza*/
          $dane2[1]=1; /* liczbe klikniec ustawiamy na 1 bo sa to pierwsze odwiedziny tego dnia*/
          $dzienny=fopen("dzienny.txt","w"); /*otwieramy plik do zapisu*/
          flock($dzienny, 2); /*blokada zapisu*/
          fwrite($dzienny, "$dane2[0]:$dane2[1]:$dane2[2]:$dane2[3]", 30); /*zapisujemy calość do pliku */
          flock($dzienny, 3);/* odblokowujemy plik */
          fclose($dzienny);/* zamykamy plik */
        }
               
               
         setcookie("licznik", "zliczono", time()+polnoc()+1 ); /* cookie blokuje licznik do konca doby */
        }else{
           
                $plik = fopen("licznik.txt", "r"); /* obsluga licznika stalego*/
                $tekst = fread($plik, filesize("licznik.txt"));
                $dane = explode(";", $tekst);
                fclose($plik);
               
                $dzienny=fopen("dzienny.txt","r"); /* obsluga licznika dziennego*/
                $dzienny_tekst =fread($dzienny, filesize("dzienny.txt"));
                $dane2 = explode(":", $dzienny_tekst);
                fclose($dzienny);
        }
?>


Przykład użycia licznika:

Stronę odwiedziło:<?php echo($dane[0]); ?> gości.
Dzisiaj (<?php echo($dane2[0]); ?>) stronę odwiedziło: <?php echo($dane2[1]); ?> gości.
Wczoraj (<?php echo($dane2[2]); ?>) stronę odwiedziło: <?php echo($dane2[3]); ?> gości.


Informacje
Ostatnia modyfikacja 19-02-2006 23:29 Ostatni autor wowo
Ilość wyświetleń 34074 Wersja 3
Komentarz
kaczor6661 dnia 06-11-2008 23:51
Witam, jestem w tym laik, czy ktoś może wyjaśnić mi krok po kroku aby to działało na stronie?? :)
bordeux dnia 26-09-2007 19:15
Musicie buforowac dane wysciowe. Posłużcie sie ob_start(); i zakonczcie ob_end_flush();
malum dnia 22-07-2007 10:13
Zauważyłem, że ze skryptem dzieje się coś dziwnego.
Wszystko było OK.
Zmieniłem jednak datę w swoim komputerze o 2 dni do przodu i ... licznik oszalał.
Przy każdym odświeżeniu doliczał wizytę oraz wizytę dzisiejszą.
Daty w pliku dzienym nie zmienił.
Teoretycznie można ząłożyć, że coś takiego zrobi inny użytkownim strony i dojdzie wówczas do solidnego przekłamania.
Co wy na to?
shogunpl dnia 28-05-2007 14:30
>Taki błąd mi się pojawił i nie wiem gdzie jest błąd.
>Warning: Cannot modify header information - headers already sent by (output started at >/home/intelal/public_html/ple22/index.php:10) in /home/intelal/public_html/ple22/index.php on line 173

Miałem to samo. Zakładając, że kod licznika masz w pliku licznik.php, to <?php include "licznik.php";?> musisz umieścić w pierwszej linii kodu strony. U mnie zadziałało. Dowód: www.nervovoohozy.roszcza.pl
m_kacper dnia 09-05-2007 18:04
Taki błąd mi się pojawił i nie wiem gdzie jest błąd.
Warning: Cannot modify header information - headers already sent by (output started at /home/intelal/public_html/ple22/index.php:10) in /home/intelal/public_html/ple22/index.php on line 173
wowo dnia 19-06-2006 15:59
@infal: za pomocą funkcji php chmod, lub przy użyciu jakiegoś menadżera plików ze strony www, ale z tego co piszesz to takiego chyba tam nie ma.
infal dnia 19-06-2006 15:34
korzystam z www.za.pl i www.friko.pl (łącznie www.8.pl). Przesyła sie tam informacje za pomocą serwera ftp. W jaki sposób nadać plikowi prawa dostępu (ów atrybut CHMOD)??
wowo dnia 14-02-2006 00:01
@Coldpeer - już myślę o zliczaniu odwiedzin tygodniowych i miesięcznych :) Jak znajdę chwilę czasu to taką opcję dodam :-)
Coldpeer dnia 13-02-2006 23:58
@SebaZ: albo FAQ :)
@wowo: A może dodasz jeszcze np. miesiąc, tydzień itp?

A swoją drogą, dzięki temu "artykułowi", naszła mnie myśl, żeby stworzyć sobie taki licznik na bazie (z uwzglednieniem dni, tygodni) :)
SebaZ dnia 13-02-2006 21:35
to raczej gotowiec niż artykuł

Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.1995 sek. (zapytań SQL: 9)