2013-12-08 5 views
5

Sto studiando il mecanismo del branco in PHP e sto avendo difficoltà a capire la funzionalità della modalità LOCK_SH. Ho letto su un sito che blocca il file in modo che altri script non possano scrivere in esso, ma possono leggere da esso. Tuttavia il seguente codice non sembra funzionare come previsto: In file1.php ho:Come funziona LOCK_SH?

$fp = fopen('my_file.txt','r'); 

flock($fp, LOCK_SH); 
sleep(20); 
flock($fp, LOCK_UN); 

E in file2.php ho

$fp = fopen('my_file.txt','a'); 
fwrite($fp,'test'); 

corro il primo script che blocca il file per 20 secondi. Con il lock in atto, eseguo file2.php che termina la sua esecuzione all'istante e dopo che ho aperto 'my_file.txt' la stringa 'test' è stata aggiunta ad essa (anche se 'file1.php' era ancora in esecuzione). Provo a cambiare 'file2.php' in modo che possa leggere dal file bloccato e che sia rosso senza problemi. Quindi apparentemente ... le cuciture "LOCK_SH" non fanno nulla. Tuttavia, se uso LOCK_EX sì, blocca il file, nessuno script può scrivere o leggere dal file. Sto usando Easy PHP ed eseguendolo sotto Windows 7.

risposta

4

flock() strumenti di blocco di consulenza, non il blocco obbligatorio. Per bloccare file2.php dal blocco file1.php, è necessario provare ad acquisire un blocco di scrittura (LOCK_EX) sul file prima di scrivere.

+0

capisco ora. Ho testato il meccanismo che hai spiegato e ha funzionato senza problemi. Sei il migliore. –

14

LOCK_SH significa BLOCCO COMUNE. Qualsiasi numero di processi PU H AVERE UN BLOCCO CONDIVISO contemporaneamente. Viene comunemente chiamato blocco del lettore.

LOCK_EX significa BLOCCO ESCLUSIVO. Solo un singolo processo può possedere un blocco esclusivo per un determinato file alla volta.

Se il file è stato BLOCCATO con LOCK_SH in un altro processo, il gruppo con LOCK_SH verrà SUCCESSO. flock con LOCK_EX BLOCCA SOLO TUTTI LETTORI DI LETTORI SONO STATI RILASCIATI.

http://php.net/manual/en/function.flock.php#78318

+0

wow come hai trovato quel commento di 10 anni fa: D? Grazie SHER_LOCK – Adam