Originariamente inviato da Belva
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