Ciao, non ho ben capito come si fa a fare in modo che uno script PHP acceda
ad un file in modo esclusivo, evitando che un'altro script vi acceda allo stesso tempo.

Ho 2 pagine PHP pagina1 e pagina2 che accedono ad uno stesso file F, rispettivamente in lettura e scrittura.

Se pagina1 legge F mentre pagina2 sta tentando di accedervi in scrittura, vorrei che pagina2 aspetti prima che la lettura sia finita, e viceversa.


Ho guardato sui manuali come si usa la funzione flock, ma secondo me non funge perchè supponiamo che i due script siano fatti così :

codice:
PAGINA1  (lettura di F)

$f = fopen(nomefile,"r");
flock($f,LOCK_SH);
 // leggi il file F
flock($f,LOCK_UN);
fclose($f);

PAGINA2  (aggiornamento di F)

$f = fopen(nomefile,"w");
flock($f,LOCK_EX);
 // scrivi sul file F
flock($f,LOCK_UN);
fclose($f);
Se ci sono due thread diversi che eseguono pagina1 e pagina2 rispettivamente,
potrebbe succedere questo:

codice:
1) Il thread2 esegue $f = fopen(nomefile,"w");
    e quindi tronca il file F che diventa un file vuoto

2) Il thread2 viene sospeso e il thread1 viene ripreso

3) Il thread1 apre il file F in lettura, chiama flock, 
    ed esegue  la lettura da F, quindi legge un file vuoto!! 

4) Il thread1 sblocca il file con flock($f,LOCK_UN);

5) Il thread1 viene sospeso e il thread2 riprende l'esecuzione,
    locka il file, ed esegue la scrittura.. ecc.

Io ho un server Apache 2.x sotto Windows e non so sinceramente se sia multithread, ma suppongo di si , e poi comunque ormai siamo nell'era del multicore e credo che tutte le nuove applicazioni abbiano più di un thread, figuriamoci un server http...


Quindi come si può evitare il problema?
ciao