Chyba ve scriptu?

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
Diky, mrknu se na to
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