模拟flock实现文件锁定

主要提供了一种思路。

  $lock0和$lock1就是文件锁定的标识符,当文件被某一用户打开的时候,$lock0和$lock1就会产生,当该文件没打开则不存在。

  其实最关键就是有个标识符来表示当前这个文件的状态, $lock0和$lock1就是起这样的作用。

复制代码 代码如下:

<?php   // Lock a file, timing out if it takes too long.   function lock ($lock, $tries) {          $lock0 = ".{$lock}0";          $lock1 = ".{$lock}1";          for ($i=0; $i<$tries; $i++) {                  if (!is_file($lock0)) {                          touch($lock0);                          if (!is_file($lock1)) {                                  touch($lock1);                                  return 1;                          }                  }                  usleep(100);          }          return 0;   }   // Unlock a file.   function unlock ($lock) {          unlink(".{$lock}1");          unlink(".{$lock}0");   }   // Usage example.   $filename = "somefile";   $data = "stuff and thingsn";   $tries = 10;   if (lock($filename, $tries)) {          $h = fopen($filename, "a") or die();          fwrite($h, $data);          fclose($h);          /**            * 另外一个进程写文件,检查是否锁定          */          if (lock($filename, $tries)) {                  $h2 = fopen($filename, "a") or die();                  fwrite($h2,'check lock');                  fclose($h2);           }else{               //die("Failed to lock $filename after ".($tries*100)." milliseconds!";           }           unlock($filename);   } else {          //die("Failed to lock $filename after ".($tries*100)." milliseconds!";   }   ?>