Mám udělané počítadlo přes textový soubor. Občas se ale stane, že se soubor vynuluje (naposled po 600). Je tato chyba ve skriptu nebo na WZ?
Doufám, že i přes opakované používání stejných názvů pro proměnné to bude pochopitelné. NEJDE mi ale o zpřehlednění kódu, ale o TU chybu.
<?
$soubor = "counter.txt";
if(!file_exists($soubor)):
$filename = fopen($soubor,"w");
fputs($filename, "0");
fclose($filename);
endif;
if(!isset($_COOKIE[CounterCookie])):
//zjisti hodnotu pocitadla
$zdroj = fopen($soubor,"r");
$value = fread($zdroj, filesize($soubor));
fclose($zdroj);
//zvysi hodnotu pocitadla o 1
$zapis = fopen($soubor, "w");
$value = ($value + 1);
fwrite($zapis,$value);
fclose($zapis);
clearstatcache (); //vymaze cacheovany filesize
endif;
$zdroj = fopen($soubor,"r");
$value = fread($zdroj, filesize($soubor));
fclose($zdroj);
echo $value;
?>
Předem díky
Ja bych rek, ze je to v pohode,... ale se souborama moc nedelam, takze na to moc nespolehej...
Me se stavalo neco podobnyho... Nahraval jsem soubor (myslim, ze to byly styly) a jeste nez se stacil nahrat jsem se na tu stranku podival a trada, soubor se stylama byl prazdnej :)
A doplním, že cookie je vytvářena jiným skriptem (na začátku stránky a jen není-li už přítomna) a má časově omezenou platnost.
Non_E:
>> Občas se ale stane, že se soubor vynuluje (naposled po 600).
Je to způsobeno, že pokud se do souboru zapisuje ve stejnou dobu několikrát, data se prostě neuchovají a vymažou.
Hledej zde v diskusi funkci flock() a taky v PHP manuálu:
http://cz.php.net/manual/cs/function.flock.php
Ano, tak nějak. Pokud se sejdou dvě spuštění skriptu paralelně, jeden soubor otevře pro zápis a druhý teprve potom pro čtení, tak ten chudák co to zkouší číst najde nově založený prázdný soubor a pokouší se do něho zapsat první záznam. Mezitím sice první skript soubor uzavře se správným číslem, ale poté jej přepíše počáteční hodnotou ten skript spuštěný později.
Řešení je několik:
a) při otevření prázdného souboru počkat, až jej jiný skript uzavře
b) pokud má soubor nulovou velikost, tak do něj nezapisovat data
c) použít k sledování návštěvnosti databázi
Straka