你问的是 php 的问题吗?看你的描述似乎不是因为 php 不会出现你说的现象。
被 flock 锁定的文件可被 fclose 解锁,而 fclose 会在程序结束时隐式的调用
何况 php 的 flock 是咨询方式的,也就是说锁定是相对 php 程序而言的。并不限制非 php 程序的访问

解决方案 »

  1.   

    是PHP的问题啊, 我在本机上试过了<?php  require("session.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);
     }
    ?>
      

  2.   

    仅 flock 不存在你说的现象
    你的问题可能是 session 引起的
      

  3.   

    不对, 是 class 引起的<?php
      $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里用了成员保存打开的句柄,就会会导致这种情况,就算客户关闭浏览器,那个文件依旧被占用,无法释放
      

  4.   

    加个判断就可以了<?php
      $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);
    }

    }
     
    ?>