PHP文件锁解析 flock()

本文详细介绍了PHP中文件的写入与读取操作,并探讨了不同类型的文件锁如何影响这些操作。包括普通写入读取、写锁LOCK_EX、读取不堵塞及共享锁的应用场景与效果。
1、普通写入和读取
b.php写入

$file = 'tt.txt';
$fp = fopen($file,'a+b');
fwrite($fp,"c");
sleep(3);
fwrite($fp,"a");


c.php读取

$file = 'tt.txt';
$fp = fopen($file,'rb');
echo fread($fp,1000);
fclose($fp);


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


2、 写文件使用写锁LOCK_EX
b.php写入

$file = 'tt.txt';
$fp = fopen($file,'a+b');
if(flock($fp,LOCK_EX)){
fwrite($fp,"c\r\n");
sleep(3);
fwrite($fp,"a\r\n");
flock($fp,LOCK_UN);
}

c.php读取

$file = 'tt.txt';
$fp = fopen($file,'rb');
echo fread($fp,1000);
fclose($fp);

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

3、 写入锁定,读取文件使用不堵塞,即当发生其他文件在写而锁定时,会返回被锁定的标志而不等待
b.php写入

$file = 'tt.txt';
$fp = fopen($file,'a+b');
if(flock($fp,LOCK_EX)){
fwrite($fp,"c\r\n");
sleep(3);
fwrite($fp,"a\r\n");
flock($fp,LOCK_UN);
}

c.php读取

$file = 'tt.txt';
$fp = fopen($file,'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) 用于判定可能多个人在写同个文件的情况,使用其立刻知道当前为共享锁状态而不用等待
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值