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ì :
Se ci sono due thread diversi che eseguono pagina1 e pagina2 rispettivamente,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);
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

Rispondi quotando