你问的是 php 的问题吗?看你的描述似乎不是因为 php 不会出现你说的现象。
被 flock 锁定的文件可被 fclose 解锁,而 fclose 会在程序结束时隐式的调用
何况 php 的 flock 是咨询方式的,也就是说锁定是相对 php 程序而言的。并不限制非 php 程序的访问
被 flock 锁定的文件可被 fclose 解锁,而 fclose 会在程序结束时隐式的调用
何况 php 的 flock 是咨询方式的,也就是说锁定是相对 php 程序而言的。并不限制非 php 程序的访问
lock("test.txt");
lock("test.txt"); // 因为某种原因导致又错误的锁了一次, 导致造成死锁, 这时候就算关闭网页, 那个test.txt文件也无法被其他任何进程写入 function lock($name){
if(!file_exists($name)){
if(!$_file=fopen($name,"a+")) return false;
fclose(_file);
}
if(!$_file=fopen($name,"r+")) return false;
fseek($_file,0,SEEK_SET);
flock($_file,LOCK_EX);
}
?>
你的问题可能是 session 引起的
$file=new obj("test.txt",true);
$file1=new obj("test.txt",true);class obj{
var $_file=0;
function obj($name,$lock=false){
if(!file_exists($name)){
if(!$this->_file=fopen($name,"a+")) return false;
fclose($this->_file);
}
if(!$this->_file=fopen($name,"r+")) return false; flock($this->_file,LOCK_EX);
}
}
?>
如果在class里用了成员保存打开的句柄,就会会导致这种情况,就算客户关闭浏览器,那个文件依旧被占用,无法释放
$file=new obj("test.txt",true);
$file1=new obj("test.txt",true);class obj{
var $_file=0;
function obj($name,$lock=false){
global $LOCK;
if(!is_array($LOCK)) $LOCK=[];
if(isset($LOCK[$name])) return true;
if(!file_exists($name)){
if(!$this->_file=fopen($name,"a+")) return false;
fclose($this->_file);
}
if(!$this->_file=fopen($name,"r+")) return false; flock($this->_file,LOCK_EX);
}
}
?>