Newsgroup: it.comp.www.php
Titolo: flock(), una verifica apparentemente impossible

Ciao a tutto il gruppo.
Dalla pag1.php scrivo un file:
 $destinaz="file.txt";
 $fp=fopen($destinaz,'w');
/* Per ora l'ho aperto. Adesso, per evitarne il possibile
danneggiamento, lo proteggo da eventuali interferenze di un secondo
utente */
 flock ($fp,2);
 fwrite($fp,"ciao\n"); // lo sovrascrivo
 flock($fp,3); // lo "sproteggo"
 fclose($fp); // lo chiudo.
Mi pare che la procedura sia corretta, vero?
Ora, non che non sia convinta dell'efficacia della funzione flock(), ma
gradirei verificarla... e sono a corto di idee per farlo :(
Vi faccio un esempio pratico di quel che intendo dire: l'utente Pippo ha
aperto pag1.php, e in quel momento scrive "ciao" sul file.txt. Un
microsecondo più tardi arriva l'utente Paperino (che trova il file.txt
"occupato"). Che cosa succede a Paperino? Viene automaticamente messo in
attesa? Non credo. Riceve un errore? Forse. In altre parole, vorrei
trovarmi nella situazione di Paperino, ma (da soli) non si può essere
Pippo e Paperino nello stesso istante.
Dunque, il mio problema è questo: come posso essere sicura che flock
svolga realmente il suo compito? Io (ripeto: da sola) non posso certo
verificarlo, e anche se mi mettessi d'accordo con un amico disposto a
stare un'ora a raggiungere "pag1.php", sarebbe molto improbabile
azzeccare la simultaneità degli eventi.
Allora ho provato a NON completare il codice, così:
 
$fp=fopen($destinaz,'w');
 flock ($fp,2);
// (nient'altro)
e ad andare immediatamente ad una nuova pagina.php ("pag2.php",
anch'essa contenente fwrite e che agisce sullo stesso "file.txt");
speravo che la protezione data da pag1.php rimanesse attiva. E invece
no: "file.txt" viene sovrascritto comunque :-(
Me la date un'idea per sincerarmi che flock faccia realmente il suo
dovere? Grazie e scusate la lunghezza del post ^_^
-- 
Nicoletta

 Ciao a tutto il gruppo.
non ho mai usato questa funzione, ma sul manuale trovo queste note:
flock() will not work on NFS and many other networked file systems. 
Check your operating system documentation for more details.
Su molti sistemi operativi flock() è implementato a livello di processo. 
Usando un server API multithread quale ISAPI non potrai basarti su 
flock() per proteggerre i file da altri script PHP che girino in thread 
paralleli della stessa istanza del server!
forse sei in questa situazione?
Ciao Gianfranzo
-- 
ICQ#: 21258924 Nick Gianfranzo
Home page 
http://www.gianfranzo.it
Gianfranzo è contro la guerra
"dopo tutto, gli angeli non sono altro che dei volatili" D. Pennac

 Pippo e Paperino nello stesso istante.
metti un bel sleep in mezzo ed aprire due/tre sessioni:
pseudocode
fopen
flock
fwrite
echo 1
sleep 10
fwrite
echo 2
sleep 10
flock
fclose
echo end

 dovere? Grazie e scusate la lunghezza del post ^_^
metti delle pause in paperino e lancia molti pippo.
ciao
Alesi_27

 metti un bel sleep in mezzo ed aprire due/tre sessioni:
Mi aggancio qui per rispondere a tutti. 
Sembra andare tutto bene, ho fatto così:
1. Sul server (Linux di Aruba) ho creato una cartella dandole il
chmod 777, un file pippo.php e un file paperino.php.
2. In pippo.php ho scritto questo:
   $destinaz="cartella/file.txt";
   $fp=fopen($destinaz,'w');
   flock ($fp,2);
   fwrite($fp,"sono Pippo");
 
   sleep(60); // ATTENZIONE: QUI C'E' UN MINUTO DI ATTESA
   flock($fp,3);
   fclose($fp);
header("Location: NuovaPagina.php"); // QUESTO SERVE PER VEDERE SE
SLEEP() FUNZIONA, non l'avevo mai provato
In paperino.php c'è l'identico di pippo.php ma SENZA sleep(60) e,
naturalmente, in fwrite() c'è scritto "sono Paperino".
3. Ho aperto Explorer e Netscape. Nella location bar di Explorer ho
scritto 
www.miodominio.it/pippo.php
, in quella di Netscape ho scritto
www.miodominio.it/paperino.php
4. Ho dato l'invio ad Explorer per raggiungere pippo.php (ho iniziato a
vadere l'attesa, e la NuovaPagina.php non arrivava. Tutto in regola.)
5. Sono andata velocemente su Netscape e ho dato l'invio per raggiungere
paperino.php (anche paperino.php, nonostante fosse privo di sleep(60),
ha iniziato ad attendere).
6. Sono andata velocemente sul server, ho prelevato il file.txt e ho
visto che c'era scritto "sono Pippo".
7. Terminati i 60 secondi, ho visto Explorer che mi rimandava su
NuovaPagina.php, e Netscape (un attimo dopo) faceva la stessa cosa.
8. Sono andata sul server, ho prelevato il file.txt e ho visto che c'era
scritto "sono Paperino".
Tutto qui.
A me sembra che il test abbia dato risultati positivi (nel senso che la
funzione flock() pare proprio efficace). 
Anche a voi pensate la stessa cosa? 
Carissimi Jurgen, Gianmarco e alesi_27, vi ringrazio moltissimo per
l'idea che mi avete dato e per la gentilezza. A presto e buon lavoro.
-- 
Nicoletta