2013-12-08 6 views
5

Studiuję steryzm w języku PHP i mam problem ze zrozumieniem funkcjonalności trybu LOCK_SH. Czytam na stronie, że blokuje ona plik, aby inne skrypty nie mogły go WRITE, ale mogą ODCZYTAĆ z niego. Jednak poniższy kod nie wydają się działać zgodnie z oczekiwaniami: W file1.php mam:Jak działa LOCK_SH?

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

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

I file2.php mam

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

uruchomić pierwszy skrypt, który blokuje plik przez 20 sekund. Po uruchomieniu blokady uruchamiam plik file2.php, który natychmiast kończy jego wykonywanie, a po otwarciu pliku "my_file.txt" został do niego dołączony napis "test" (mimo że plik "file1.php" nadal działał). Próbuję zmienić plik "file2.php", tak aby był czytany z zablokowanego pliku i był czerwony od niego bez żadnych problemów. Tak więc, widocznie ... szwy "LOCK_SH" nie robią nic. Jednakże, jeśli użyję LOCK_EX tak, to blokuje plik, żaden skrypt nie może pisać lub czytać z pliku. Używam Easy PHP i uruchamiam go pod Windows 7.

Odpowiedz

4

implementuje blokowanie doradcze, nieobowiązkowe blokowanie. Aby zablokować file2.php przez blokadę file1.php, przed zapisaniem należy spróbować zapisać blokadę pliku (LOCK_EX).

+0

Teraz rozumiem. Przetestowałem mechanizm, który wyjaśniłeś i działał bez żadnych problemów. Jesteś najlepszy. –

14

LOCK_SH oznacza SHARED LOCK. Dowolna liczba procesów MOŻE MIEĆ UDOSTĘPNIONE LOCK jednocześnie. Jest powszechnie nazywany blokadą czytnika.

LOCK_EX oznacza WYŁĄCZNY ZABLOK. Tylko jeden proces może mieć wyłączną blokadę dla danego pliku naraz.

Jeśli plik został ZABLOKOWANY z LOCK_SH w innym procesie, flokowanie z LOCK_SH zostanie ZOSTAŁO SUCCEED. flock z LOCK_EX będzie BLOCK UNTIL ALL CZYTNIKI ZOSTAŁY ZWOLNIANE.

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

+0

wow, skąd wziąłeś ten komentarz sprzed 10 lat: D? Dziękuję SHER_LOCK – Adam