Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Licznik wejść czasami się cofa
Forum PHP.pl > Forum > PHP
marcwars
Witam,
zrobiłem licznik wejść, który zapisuje w oddzielnym pliku każde wejścia:

Kod
<?php


$licznik = file_get_contents('licznik.txt');
echo $licznik;
$licznik++;
file_put_contents('licznik.txt', $licznik);
}
else
{
$licznik = file_get_contents('licznik.txt');
echo $licznik;


?>


Niestety, co jakiś czas, licznik jakby się cofa, czyli np. było 8 tys.wejść a pojawia się znowu 1,8 tys.

Czy ktoś może mi zdradzić gdzie jest błąd i czy można temu zaradzić?
Na razie co jakiś czas zmieniam ręcznie plik licznik.txt, ale to oczywiście bez sensu:)
NickOver
Wrzuć cały skrypt. Możliwe że gdzieś nadpisujesz zmienną.
marcwars
To jest cały skrypt umieszczony w wordpressie. Zmieniłem na zliczanie wejść tylko na stronę główną, ale dalej co parę dni wyskakuje taki problem.
kafowi
Co w przypadku kilku wejść jednocześnie?
Zeruje się.
marcwars
Chyba serwer na którym jest plik przyjmuje jakąś kolejność, w której zapisuje kolejne wersje pliku.
Plik się nie zeruje, tylko spada do poziomu sprzed paru dni.
NickOver
Jeśli to cały skrypt to gdzie jest if?
marcwars
Rzeczywiście, sorry, cały kod:
Kod
if (is_home())
{
$licznik = file_get_contents(licznik.txt');
echo $licznik;
$licznik++;
file_put_contents('licznik.txt', $licznik);
}
else
{
$licznik = file_get_contents('licznik.txt');
echo $licznik;
}


funkcja is_home() bo to wordpress, dodałem po pierwszej awarii (też licznik wracał do poprzedniego stanu), żeby tylko zliczał wejścia na główną stronę.
markuz
Brakuje ' przed liczniki.txt, po pobraniu treści rzutuj na int $licznik = (int) $licznik;
Zrób if($licznik = file_get_contents('licznik.txt')) być może czasami ma problem z pobraniem treści, $licznik ustawia na 1 (bo_nie_istnieje++ = 1) i zapisuje 1 zamiast $licznik + 1.
marcwars
Dzięki za konkretne wskazówki.
Źle skopiowałem, jest prawidłowo 'licznik.txt'.

A resztę mam zrobić tak jak poniżej?

Kod
if (is_home())
{
$licznik = file_get_contents('licznik.txt');
$licznik = (int) $licznik;
echo $licznik;
$licznik++;
file_put_contents('licznik.txt', $licznik);
}
else
{
$licznik = file_get_contents('licznik.txt');
echo $licznik;
}


Problem polega na tym, że licznik nabija się na parę tysięcy i wraca np. na 1.800 wejść. Ostatnio ręcznie zmieniłem plik na 500.000 (zgodnie z prawdziwymi danymi z Google analytics), ale znowu wróciło po jakimś czasie na 1.875.
Licznik raczej nie wraca na 1, bo ta strona nie ma aż takiego obrotu, żeby aż do czasu zauważenia błędu pojawiło się już 1.875 lub inna niższa liczba. Przed zmianą ręczna też był przypadek, że z 8.000 spadło na tysiąc parę.
Pyton_000
problemem może być to że podczas zapisu do pliku w tym samym momencie jest próba odczytu.
Użyj fopen (z odpowiednimi flagami) fwrite fread flock

Ktoś już na forum miał problem z jednoczesnym odczytem/zapisem przez file_*_contents
marcwars
Dzięki za wskazówki.
Wymyśliłem coś takiego:

Kod
$licznik = fopen('licznik.txt', 'w+');
if (flock($file,LOCK_EX))
  {
$dodaj=fgets($file, 100);
$dodaj++;
  fwrite($file,$dodaj);
   flock($file,LOCK_UN);
  }
else
  {
  echo $licznik;
  }

fclose($file);


Będę wdzięczny za komentarz,czy to jest ok.
Pyton_000
ten else jest źle bo wyświetli Ci "połączenie" a nie zawartość. $dodaj rzutuj na (int)
marcwars
czyli tak?

Kod
$file = fopen('licznik.txt', 'w+');
if (flock($file,LOCK_EX))
  {
$dodaj=fgets($file, 100);
$dodaj=(int)$dodaj;
$dodaj++;
echo $dodaj;
  fwrite($file,$dodaj);
   flock($file,LOCK_UN);
  }
else
  {
$pokaz=fgets($file, 100);
$pokaz=(int)$pokaz;
  echo $pokaz;
  }

fclose($file);


Może mi ktoś ocenić ten kod?

Niestety wyświetla mi '1' nie chce się zwiększać thumbsdownsmileyanim.gif
Grzesie.k
  1. <?php
  2. echo number_format(myViewCounter('counter.txt'), 0, ',', ' ');
  3.  
  4. /**
  5.  * @param string $fileName
  6.  * @return int
  7.  */
  8. function myViewCounter($fileName)
  9. {
  10. $counter = is_readable($fileName) ? (int)file_get_contents($fileName, false, null, -1, 12) : 0;
  11. is_writable($fileName) && file_put_contents($fileName, ++$counter, LOCK_EX);
  12. return $counter;
  13. }
marcwars
Generalne dzięki za pomoc.
Skrypt działa, chociaż na początku wyzerował plik licznik.txt i musiałem na nowo dopisać ostatni stan z Google analytics.
Na razie działa poprawnie, czyli:
- nie cofa się,
- dodaje kolejne wejścia.
Natomiast minusem jest to, że jeśli mam otwartą stronę główną i podstronę, to przy odświeżenie dodaje 2.
sazian
możesz w ciastku/sesji zapisywać czas ostatniej akcji użytkownika i odświeżać licznik co np. 60 sekund
marcwars
Chyba pochwaliłem za szybko, bo znowu się wszystko cofnęło do stanu 3 tysiące z hakiem...
Będę wdzięczny za sugestie, co jeszcze zmienić.
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.