2017-01-03 108 views
0

我發現在flock manual下面的描述:有可能flock用LOCK_EX返回false?

默認情況下,該函數將阻塞,直到所請求的鎖是 獲取

此外下面我發現了以下示例代碼:

<?php 

$fp = fopen("/tmp/lock.txt", "r+"); 

if (flock($fp, LOCK_EX)) { // acquire an exclusive lock 
    ftruncate($fp, 0);  // truncate file 
    fwrite($fp, "Write something here\n"); 
    fflush($fp);   // flush output before releasing the lock 
    flock($fp, LOCK_UN); // release the lock 
} else { 
    echo "Couldn't get the lock!"; 
} 

fclose($fp); 

?> 

但是有沒有任何情況下腳本實際上會返回"Couldn't get the lock!"?我認爲它一直等到文件lock.txt被解鎖。如果文件永遠不能解鎖,那麼腳本將永遠等待,對吧?

而且,我發現這個答案說明在UNIX排他性和共享鎖的區別:https://stackoverflow.com/a/11837714/2311074 做這4條規則也適用於PHP涌向(例如,「如果已經存在一個或多個共享鎖,獨佔鎖不能獲得「)?

+0

我能想象,還有其他情況下該功能可能會返回FALSE,例如,如果該句柄無效或者文件系統不支持鎖定或類似。 – arkascha

回答

0

是的,我發現,建設flintstone時候,它不會涌向一個壓縮文件流...

$file = 'compress.zlib://path/to/file.txt'; 
$fp = fopen($file, 'w'); 
var_dump(flock($fp, LOCK_EX)); // false