php中的文件锁是什么

发布时间:2019-08-08 23:49     分类:Php
1、普通写入和读取
test1.php写入:
$filename = 'test1.txt';
$fp = fopen($filename,'a+b');
fwrite($fp,"c");
sleep(3);
fwrite($fp,"a");

test2.php读取:
$filename = 'test1.txt';
$fp = fopen($filename,'rb');
echo fread($fp,1000);
fclose($fp);

结果:test1文件一边写入,test2文件可以一边读取,不存在锁的情况,test2.php不用等待,当有内容时就能够立刻读取到内容


2、 写文件使用写锁LOCK_EX
test1.php写入:
$filename = 'test1.txt';
$fp = fopen($filename,'a+b');
if(flock($fp,LOCK_EX)){
fwrite($fp,"c\r\n");
sleep(3);
fwrite($fp,"a\r\n");
flock($fp,LOCK_UN);
}

test2.php读取:
$filename = 'test1.txt';
$fp = fopen($filename,'rb');
echo fread($fp,1000);
fclose($fp);

结果:现在锁的情况。即,b文件在写但还没有写完的时候,c文件不能读取到内容,只有b写完了,c能才获得内容。

3、 写入锁定,读取文件使用不堵塞,即当发生其他文件在写而锁定时,会返回被锁定的标志而不等待
test1.php写入:
$filename = 'test1.txt';
$fp = fopen($filename,'a+b');
if(flock($fp,LOCK_EX)){
fwrite($fp,"c\r\n");
sleep(3);
fwrite($fp,"a\r\n");
flock($fp,LOCK_UN);
}

test2.php读取:
$filename = 'test1.txt';
$fp = fopen($filename,'rb');
if(flock($fp,LOCK_SH | LOCK_NB)){ //LOCK_NB需要与前面3种状态配合才能使用
echo fread($fp,1000);
flock($fp,LOCK_UN);
}else{
echo 'lock file failed...';

}


4、共享锁
a.php读,使用共享锁
$file = 'tt.txt';
$fp = fopen($file,'rb');
if(flock($fp,LOCK_SH)){
echo fread($fp,1000);
sleep(3);
flock($fp,LOCK_UN);
}
fclose($fp);

b.php写锁定
$file = 'tt.txt';
$fp = fopen($file,'a+b');
if(flock($fp,LOCK_EX)){ //这里LOCK_EX如果换成LOCK_SH则完全写入不了,因为一开始就被自已文件的程序给共享锁了
fwrite($fp,"c\r\n");
flock($fp,LOCK_UN);
}

c.php同a.php共享读
$file = 'tt.txt';
$fp = fopen($file,'rb');
if(flock($fp,LOCK_SH)){
echo fread($fp,1000);
flock($fp,LOCK_UN);
}
fclose($fp);

先执行a.php,再执行b.php,然后立刻执行c.php
结果为:a中可以读到文件,b中的写需要等a读完才能写,c中在a共享锁的情况下也可以读到同个文件的内容。

LOCK_EX与LOCK_SH区别:
LOCK_EX是写锁定,即写入的时候文件处于写锁状态,别人不能写也不能读。如果直接读,将是一段时间的等待,别人写完了,解锁后才恢复,也才能读。
LOCK_SH是共享锁定,即读的时候文件处于共享锁状态,别人只能读,不能写。如果直接写,将是一段时间的等待,别人读完了,解锁后才恢复,也才能写。

LOCK_UN:用于解锁前面两种状态
LOCK_NB:在读取或者写入时,如果文件被锁,则立刻返回通知访问的文件被锁了,不用再等待。不能单使用需要与前面两种方式配合使用,例如:
flock($fp,LOCK_SH | LOCK_NB)
用于判定有些人在写,而有些人在读同个文件的情况,使用其立刻知道当前为写锁状态而不用等待。

flock($fp,LOCK_EX | LOCK_NB) 用于判定可能多个人在写同个文件的情况,使用其立刻知道当前为共享锁状态而不用等待。

评论

推荐文章