Autor Zpráva
phpcko
Profil *
Dobrý den,

Na webu používám skript, který slouží jako počítadlo určitých akcí na webu.

$dollarsx = file_get_contents("../../totalR.txt");
$fp = fopen ("../../totalR.txt", "w");
fwrite ($fp, $dollarsx+1);
fclose ($fp);

Zapisuje se tam často i přes tisíc zápisů +1 za den, ale už dvakrát se mi stalo, že se číselná hodnota v souboru vynulovalo a začalo se počítat od znovu. Čím to může být?
Jan Tvrdík
Profil
phpcko:
Čím to může být?
Tím, že ten skript není thread safe.
Davex
Profil
Viz
Atomicita operací
Atomické operace se soubory
Atomické operace ještě jednou

Nejvhodnější by bylo použít na to počítání databázi, která to řeší sama.
phpcko
Profil *
Děkuji za rady. Nestačilo by použít file_put_contents místo Fopen? file_put_contents by mělo být rychlejší...


Jde mi tedy především o to aby se soubor nevynuloval, když by občas byly dva zápisy +1 najednou a jeden se ignoroval tak to není takový problém.
juriad
Profil
phpcko:
Tím si nepomůžeš. Viz komentář http://cz1.php.net/manual/en/function.file-put-contents.php#82934
Zelináč
Profil *
Mám obdobný problém a výše uvedené odkazy mne nepomohly :(

Chtěl bych pomocí file_put_contents(); ukládat textový soubor text.log ke kterému může kdykoliv přistupovat jiná aplikace.

Soubor text.log bych potřeboval několikrát denně přepsat aktuálními daty a potřebuji vědět jak to mám ošetřit aby nedošlo k nějaké kolizi, kdyby čtecí aplikace začala číst v době kdy je soubor text.log právě aktualizován a není ještě "kompletně uložen".... aby počkala až bude dokončen zápis…. Jak nato?

Děkuji
Alphard
Profil
Použil bych hotové řešení z Nette doc.nette.org/cs/2.1/atomicity.
Zelináč
Profil *
to mi ale za boha nefunguje!

Warning: file_put_contents(safe://test.txt) [function.file-put-contents]: failed to open stream: Invalid argument in .....


Kvůli této jediné funkci přeci nebudu nasazovat celý framework? To nejde řešit v prostém PHP na několik řádků kódu?
DJ Miky
Profil
Třída SafeStream z Nette nezávisí na žádné jiné třídě, můžeš ji použít klidně samostatně bez zbytku frameworku. Jenom nezapomeň protokol zaregistrovat (SafeStream::register();).
Zelináč
Profil *
Díky, ala na localhostu mi to nefachá:

 $finale="Nějaký text a tak....";

 require("SafeStream.php");
 SafeStream::register();

 file_put_contents('safe://a.txt', $finale);

: Warning: rename(C:\xampp\htdocs\www\a.txt~~0.631266138493.tmp,C:\xampp\htdocs\www\a.txt) [function.rename]: File exists in C:\xampp\htdocs\www\SafeStream.php on line 160
Jan Tvrdík
Profil
Zelináč:
Nemáš náhodou PHP starší než 5.3.0?
Zelináč
Profil *
https://github.com/nette/nette/releases/download/v2.0.14/NetteFramework-2.0.14-PHP5.2.zip

Toto jsem stáhnul a na web-serveru (5.2.17) mi to už jede :). Akorát na localhostu nikoliv (5.2...) ale to nevadí......... Takže děkuji.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: