2017-01-03 14 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