Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Licznik odwiedzin - co jakiś czas sam się zeruje!
Forum PHP.pl > Forum > PHP
przemek76
Mam problem ze skryptem licznika odwiedzin opartym o sesję. Co jakiś czas zeruje się i nie mogę dojść dlaczego? Czy to problem z jednoczesnym dostępem do pliku przez wielu użytkowników? Może wtedy zamiast do pliku lepiej byłoby zapisywać do tabeli MySQL? Może pewniejszy byłby na ciasteczku, a nie na sesji? (przy okazji: zauważyłem, że w IE zlicza wejście za pierwszym razem, a potem nawet jak zamknę przeglądarkę i otwieram stronę ponownie to nie dodaje odwiedzin. Muszę dopiero celowo zakończyć sesję poleceniem session_destroy. Natomiast w Firefoxie jest prawidłowo).

A oto ten skrypt:
  1. <?php session_start();
  2. if (empty($_SESSION['sesja'])) { //JEŚLI ZMIENNA SESYJNA JEST PUSTA:
  3.  $plik = fopen("licznik.txt", "r"); //otwieramy plik do odczytu
  4.  $odczyt = explode(";", fread($plik, filesize("licznik.txt"))); //czytamy z pliku
  5.  $stan_licznika = $odczyt[0] + 1; //ustalamy stan licznika
  6.  fclose($plik); //zamykamy plik, a następnie...
  7. $plik=fopen("licznik.txt","w"); //otwieramy plik do zapisu
  8. flock($plik, 2); //blokujemy plik do zapisu
  9. fwrite($plik, "$stan_licznika;", 15); //zapisujemy do pliku
  10. flock($plik, 3); //odblokowujemy plik
  11. fclose($plik); //zamykamy plik
  12.  $_SESSION['sesja'] = 1; //i deklarujemy zmienną sesyjną.
  13. } else { //W PRZECIWNYM RAZIE:
  14.  $plik = fopen("licznik.txt", "r"); //otwieramy plik do odczytu
  15.  $odczyt = explode(";", fread($plik, filesize("licznik.txt"))); //czytamy z pliku
  16.  $stan_licznika = $odczyt[0]; //ustalamy stan licznika
  17.  fclose($plik); //zamykamy plik.
  18. } ?>

No i potem gdzieś w pliku jest: echo $stan_licznika;
kicaj
Wyedytuj post i zastosuj kod PHP
Kostek.88
Ja miałem coś takiego:

  1. <?php
  2.  setcookie('zapamietaj', '1', time()+60*60*24);
  3.  if(!(file_exists("dane/licznik.txt"))) {
  4. $plik = fopen("dane/licznik.txt", "w+");
  5. fputs($plik, "0");
  6. fclose($plik);
  7.  }
  8.  
  9.  $plik = fopen("dane/licznik.txt", "r+");
  10.  
  11.  if(!($plik)) {
  12. echo 'BŁĄD: Nie da się otworzyć pliku';
  13.  } else {
  14. flock($plik, 2);
  15. $ile = fgets($plik, 255);
  16.  
  17. echo 'Licznik wskazuje <b>'.$ile.'</b>';
  18.  
  19.  
  20. /*
  21.  
  22.  sorki, tu niżej była pomyłka (jeśli cookie nie istnieje to zwiększamy stan licznika), zmień też warunek if
  23.  
  24. */
  25. if($_COOKIE['zapamietaj']!=1) {
  26.  fseek($plik, 0);
  27.  fputs($plik, $ile+1);
  28.  flock($plik, 3);
  29.  fclose($plik);
  30. }
  31.  }
  32. ?>
przemek76
Dzięki za odpowiedź - spróbuję tego licznika. snitch.gif

Zauważyłem, że w twojej propozycji rozpoznawany jest błąd otwarcia pliku. Czy jest możliwe, że u mnie właśnie to jest problemem?
Tak sobie pomyślałem, że jeśli ktoś czyta z pliku i ktoś inny też spróbuje się do niego dostać (w tej samej chwili wszedł na stronę), to nic nie odczyta, a więc zmienna $odczyt będzie pusta i $stan_licznika ustali się na 1 (pusta zmienna + 1) i taki stan następnie zostanie zapisany do pliku. Czy możliwy jest taki scenariusz?
malvea
$plik=fopen("licznik.txt","w"); - tutaj licznik się zeruje, a następnie fwrite($plik, "$stan_licznika;", 15); zwraca błąd, czyli zero i się nic nie zapisuje i w tym tkwi problem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.