GordonFreeman
23-11-2007, 12:22
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ì :
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:
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
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ì :
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:
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