Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] mega prosty licznik odwiedzin, a jednak zawodny
marcinek37
post
Post #1





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


  1. <?
  2. $file = fopen('counter.txt', 'r'); $counter = (int)fgets($file); fclose($file);
  3. if($_SESSION['opened'] != '1'){ $counter++; $file = fopen('counter.txt', 'w'); fwrite($file, $counter); fclose($file); $_SESSION['opened'] = '1'; }
  4. ?>


raz na jakiś czas nie zapisuje wartości i liczy od nowa... ale dlaczego? jak można temu zaradzić?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Odnośnie blokady: musisz założyć blokadę (zarówno odczytu jak i zapisu) na plik przed jego odczytaniem oraz zdjąć ją dopiero po zapisaniu danych do pliku - inaczej może dojść do przekłamań w liczniku. Czyli:
  1. $fh = fopen('plik.txt', 'r+');
  2. flock($fh, LOCK_EX);
  3.  
  4. $cnt = (int) trim(fread($fh, 1024));
  5. $cnt++;
  6.  
  7. fseek($fh, 0);
  8.  
  9. fwrite($fh, $cnt);
  10. flock($fh, LOCK_UN);
  11. fclose($fh);
  12.  
  13. // Pominąłem siedem(!) IF-ów związanych z obsługą błędów...
  14. // Skorzystanie z SplFileObject niestety również będzie ich wymagało
Blokada przy samym zapisie jest niewystarczająca, jeżeli chcesz mieć solidny kod.

Odnośnie prędkości działania: jeżeli powyższy fragment będzie wąskim gardłem najwyższy czas pomyśleć nad zmianą dysku bądź platformy.

EDIT: Był drobny błąd w pow. przykładzie (typ otwarcia pliku, brak fseek)

Ten post edytował Crozin 4.12.2012, 22:13:44
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: 27.12.2025 - 09:00