[ Dejan Krstic @ 07.06.2004. 18:54 ] @
Dakle, ajmo malo da se bavimo hipotetikom :)

Sta bi bilo kada bi se dva korisnika pojavila na nekoj stranici u isto vreme a ta stranica pokusava da otvori jedan fajl za pisanje? Drugim recima sta bi bilo kada bi bio pozvan fopen() dva puta u isto vreme da otvori isti fajl za pisanje? U dokumentaciji o tome nisam nasao nista (cak ni na php sajtu gde su komentari korisnika za fu f-ju) a cenim da ce u tom slucaju php vratiti gresku odnosno da nece moci da otvori. E sad, ako se radi o mission critical skripti kako izbeci to i izvesti zapisivanje dva puta bez vracanja greske?
[ noviKorisnik @ 07.06.2004. 22:22 ] @
Ne mora da bude hipotetika. Lako napraviš testni primer.
Citat:
E sad, ako se radi o mission critical skripti kako izbeci to i izvesti zapisivanje dva puta bez vracanja greske?

Ipak je bolje prvo testirati. Da sad ne lupam ko bi trebao ili ne da detektuje duplo otvaranje fajla - operativni sistem, web server ili php; kao i način upisivanja podataka. Recimo, jedan ekstremni slučaj je da greška nije detektovana uopšte, obe skripte obave svoje pisanje, poslednja pretaba izmene prve - jednom se živi...

Mada mi je logično da se postavi lock na fajl pri prvom otvaranju i tada bi druga skripta trebala da odloži svoj pokušaj za upis za neko vreme (a tako nešto postoji, ako ne ima da izmislimo)...
[ Dejan Krstic @ 07.06.2004. 23:06 ] @
Code:
$h = fopen("fajl","w");
fwrite($h, "bla");
fclose($h);


Bez obzira na konfiguraciju racunara vreme za ovo bi trebalo da se meri u milisekundama. E sad, ukoliko se desi da u vreme dok je prva skripta otvorila fajl, druga skripta pokusa da ga otvori i zapise nesto, skoro sam siguran da ce druga vratiti error (nebitno kakav) i da nista od tog otvaranja/upisivanja/zatvaranja nece biti. E sad pitanje je, kako to izbeci?
[ noviKorisnik @ 07.06.2004. 23:28 ] @
Mislio sam da se ubaci usporivač u primer:
Code:
$h = fopen("fajl","w");
delay(1000);
fwrite($h, "bla");
delay(1000);
fclose($h);

Pošto delay ne postoji može se izmisliti, odnosno treba da radi nešto što parser smatra za pametno određeni broj milisekundi.
Tako bi već bilo moguće da se preklope 2 poziva skripte.
[ McKracken @ 07.06.2004. 23:45 ] @
To onda nije mission critical skripta kad pise u fajl ...

Za to sluze rbdms-ovi, da ti ne bi razmisljao o takvim detaljima
[ _owl_ @ 08.06.2004. 00:12 ] @
Samo da dodam da u PHP-u postoji funkcija flock()
[ Dejan Krstic @ 08.06.2004. 11:08 ] @
Citat:
noviKorisnik:Mislio sam da se ubaci usporivač u primer:
Code:
$h = fopen("fajl","w");
delay(1000);
fwrite($h, "bla");
delay(1000);
fclose($h);

Pošto delay ne postoji može se izmisliti, odnosno treba da radi nešto što parser smatra za pametno određeni broj milisekundi.
Tako bi već bilo moguće da se preklope 2 poziva skripte.


Pa onda ce da drzi fajl jos vise otvoren pa je veca verovatnoca da ce da dodje do greske.

@McKracken

Ja sam lepo napisao da se bavimo hipotetikom :)
[ noviKorisnik @ 08.06.2004. 11:34 ] @
Citat:
Pa onda ce da drzi fajl jos vise otvoren pa je veca verovatnoca da ce da dodje do greske.

Naravno, to je i cilj - da postaviš stvari tako da je moguće da se to desi - dakle da ne bude samo hipotetika. Ovakvu postavku možeš i sam da simuliraš i da se realno desi da imaš simultano otvaranje fajla s više strana.

Šta kada se to desi? Sudeći po napomeni o flock, moguće je da ne dobiješ nikakvu poruku o grešci. Naravno, ako se ulovi greška, imaš: Warning o tome, $h ti je false pa dobijaš još grešaka pri fwrite i fclose.
[ Dejan Krstic @ 08.06.2004. 12:17 ] @
AAaaa.... ti si to hteo zbog testiranja. Sorry.... nisam bio ukapirao :)
[ stsung @ 12.06.2004. 10:40 ] @
Citat:
Pošto delay ne postoji može se izmisliti


Postoji funkcija sleep().

U svakom sluchaju, za ovakve situacije najkbolje je koristiti bazu.
No, ako pretpostavimo da je rad sa fajlovima u pitanju, a fajl je prva skripta zakljuchala, ondak bi neka procedura bila, pokushavati svake recimo 2 sekunde da fajl takodje zakljuchamo/otvorimo dok je li tako to ne uspemo. (prim. aut. Uzhasno reshenje ) Nisam siguran u svakom sluchaju shta bi se desilo ... jel neko probao ?

Svako dobro.
[ Goran Rakić @ 14.06.2004. 21:57 ] @
upise radiš u nezavisne datoteke, a druga skripta to sklapa u jednu. Sada sve zavisi da li samo radiš upis ili i čitaš i koji su podaci itd...