Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Licznik odwiedzin - co jakiś czas sam się zeruje!
przemek76
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 27.08.2007

Ostrzeżenie: (0%)
-----


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;

Ten post edytował przemek76 27.08.2007, 23:52:49
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
kicaj
post
Post #2





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

Ostrzeżenie: (0%)
-----


Wyedytuj post i zastosuj kod PHP
Go to the top of the page
+Quote Post
Kostek.88
post
Post #3





Grupa: Zarejestrowani
Postów: 376
Pomógł: 47
Dołączył: 23.08.2007
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Kaloryfer 28.08.2007, 00:04:53
Go to the top of the page
+Quote Post
przemek76
post
Post #4





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 27.08.2007

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedź - spróbuję tego licznika. (IMG:http://forum.php.pl/style_emoticons/default/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?

Ten post edytował przemek76 28.08.2007, 11:44:07
Go to the top of the page
+Quote Post
malvea
post
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 29.09.2007

Ostrzeżenie: (0%)
-----


$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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 14:40