模拟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!"; } ?>