Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Licznik odwiedzin... problem..., Samoistne zerowanie licznika :-(
*_ENIGMA
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 1.11.2004
Skąd: Wrocław

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


Witam!

Otórz mam na stronie licznik odwiedzin i już drugi raz sam się wyzerował (plik z liczbą odwiedzin stał się pusty) :-/

Podaję swój skrypt, bo ja już nie wiem gdzie leży przyczyna :-/
CHMOD mam ustawiony pliku z wpisami licznika (licznik.dat) na 777.

Plik licznik.php (inkludowany: @include("index/licznik.php"); )
  1. <?php
  2.  
  3. $plik = "index/licznik.dat";
  4. $waga = @filesize($plik);
  5.  
  6. $fop = @fopen("$plik", "r");
  7. @flock($fop, 1);
  8. $czytaj_l = @fread($fop, $waga);
  9. @flock($fop, 3);
  10. @fclose($fop);
  11.  
  12. $czytaj_l++;
  13.  
  14. $fop = @fopen("$plik", "w");
  15. @flock($fop, 2);
  16. @fwrite($fop, $czytaj_l);
  17. @flock($fop, 3);
  18. @fclose($fop);
  19.  
  20. echo("$czytaj_l");
  21.  
  22. ?>


Proszę o podpowiedzi jaka może być przyczyna samoistnego zerowania się tego licznika...
Najciekawsze jest to, że dałem blokadę flock() do zapisu i odczytu a i tak się wyzerował :-/

Pozdrawiam

Ten post edytował *_ENIGMA 3.10.2005, 16:40:52
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Kocurro
post
Post #2





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


Witam,

Samoistne generowanie sie licznika jest zwiazane z nastepujaca sytuacja:

Gdy zablokujesz za pomoca flock dostep do pliku najczesciej inna inwokacja skryptu nie moze odczytac jego wartosci, odczytuje wiec wartosc 0, ktora nastepnie inkrementuje. W tym samym czasie pierwsza inwokacja dokonuje zapisu i zdejkmuje blokade a druga inwokacja jest zablokowana z zapisem do chwili odblokowania zapisu.
Po odblokowaniu sie zapisu wpisuje wartosc jaka zna wiec 1 lub ciag pusty.

Ciag pusty dlatego, ze inkrementacja niczego daje w efekcie nic.

Proponuje na sam poczatek zdjecie malpek aby zobaczyc czy nie ma zadnych bledow. Po drugie proponuje linijke:

  1. <?php
  2. $czytaj_l++;
  3. ?>


zmienic na:

  1. <?php
  2. if(is_numeric($czytaj_l)){$czytaj_l++;}else{$czytaj_l=1;}
  3. ?>


Wten sposob jesli nastapi bledny odczyt wartosci licznika to zostanie wpisana 1 - wiec od zerowania bedzie dobrze zliczal. Jednak podejrzewam, ze chcesz unikanac zerowania. W tym celu mozna zrobic tak - jesli blednie odczyta to nie zapisywac. Oto kod po zmianach:

  1. <?php
  2. $plik = "index/licznik.dat";
  3. $waga = @filesize($plik);
  4.  
  5. $fop = @fopen("$plik", "r");
  6. @flock($fop, 1);
  7. $czytaj_l = @fread($fop, $waga);
  8. @flock($fop, 3);
  9. @fclose($fop);
  10.  
  11. if(is_numeric($czytaj_l)){
  12. $czytaj_l++;
  13.  
  14. $fop = @fopen("$plik", "w");
  15. @flock($fop, 2);
  16. @fwrite($fop, $czytaj_l);
  17. @flock($fop, 3);
  18. @fclose($fop);
  19.  
  20. echo("$czytaj_l");
  21. }
  22. ?>


Blad zerowania powstaje glownie wtedy gdy jedna inwokacja chce odczytac wartosc licznika podczas gdy druga zapisuje.

pozdr.
Go to the top of the page
+Quote Post

Posty w temacie


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: 6.10.2025 - 04:52