2013-12-08 11 views
5

PHP'de sürtük mecanizmi çalışıyorum ve LOCK_SH modunun işlevselliğini anlamakta zorlanıyorum. Bir siteyi okuduğumda, diğer komut dosyalarının YAZILIMI yapamayacağı şekilde dosyayı kilitler, ancak OKUYUNUZ. Aşağıdaki kod beklendiği gibi çalışmaya görünmüyordu Ancak:LOCK_SH nasıl çalışır?

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

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

Ve file2.php I

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

Ben dosyayı kilitler ilk komut dosyasını çalıştırın vardır: file1.php ben var 20 saniye boyunca. yerinde kilit ile, ben 'my_file.txt' (hala koşuyoruz oldu 'file1.php' Hintçe) kendisine eklenmiş oldu dize 'test' açıldığında, anında ve bundan sonra yürütme olduğunu bitirir file2.php çalıştırın. 'File2.php' yi kilitli dosyadan okuyabildiğim şekilde değiştirmeye çalışıyorum ve sorun olmadan kırmızıdan. Yani görünüşte ... 'LOCK_SH' hiç bir şey yapmayacak şekilde dikiş yapar. Ancak, LOCK_EX evet kullanırsam, dosyayı kilitler, komut dosyası yazamaz veya dosyadan okuyamaz. Ben Kolay PHP kullanarak ve pencereler 7.

cevap

4

flock() altında koşuyorum danışma kilitleme değil, zorunlu kilitleme uygular. file1.php 'ın kilit tarafından engellenecek file2.php için, o yazmadan önce dosya üzerinde bir yazma (LOCK_EX) kilidi almak için denemek gerekir.

+0

şimdi anlıyorum. Açıkladığınız mekanizmayı test ettim ve problemsiz çalıştı. Sen en iyisisin. –

14

LOCK_SH ORTAK LOCK anlamına gelir. Herhangi bir sayıda işlem eşzamanlı olarak bir PAYLAŞILMIŞ LOCK OLABİLİR. Bu genellikle bir okuyucu kilidi denir.

LOCK_EX özel kilit anlamına gelir. Sadece tek bir işlem, belirli bir dosyaya bir seferde özel kilit içerebilir.

Dosya başka bir işlemle LOCK_SH ile KİLİTLEDİ ise, LOCK_SH ile akın SUCCEED. LOCK_EX ile sürü TÜMÜ UNTIL OKUYUCU KİLİTLERİ ÇIKARILACAKTIR.

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

+0

vay 10 yıl önce bu yorumu nasıl buldunuz: D? Teşekkür ederim SHER_LOCK – Adam