php中flock函数,详解PHP flock() 函数的使用

一、使用示例

不阻塞文件锁定,如果锁定失败,则单独处理相应逻辑

$handle = fopen("j:/test.txt","r+"); //读写方式打开文件

if ( $handle ) {

$lock = true; //windows 平台该参数无效

if( flock($handle, LOCK_SH | LOCK_NB ,$lock) ) { //使用共享锁定,其他请求可以直接进入,LOCK_NB 为不阻塞其他进程的锁定请求,建议使用

Log::write("锁定成功,开始执行", Log::EMERG);

sleep(10);

fclose($handle);

} else {

Log::write("锁定失败,开始执行", Log::EMERG);

}

}

自定义阻塞时间,不使用默认阻塞功能,防止程序进入死循环

$handle = fopen("j:/test.txt","r+");

if ( $handle ) {

$start = time();

$isLock = false;

do {

sleep(1);

$isLock = flock($handle,LOCK_EX | LOCK_NB );

} while ( !$isLock && (time() - $start) < 15 ); //如果请求锁定时间超过15秒则不再请求,直接处理失败

if ( $isLock ) {

Log::write("锁定成功,开始执行", Log::EMERG);

sleep(10);

fclose($handle);

} else {

Log::write("锁定失败,开始执行", Log::EMERG);

}

}

二、注意事项

fopen函数的mode参数设定最好和flock的锁定标识参数operation进行同步,如果是fopen打开文件的模式为读,则锁定的模式也必须为读;如果打开文件的模式为写,锁定的模式为读则即使使用fwrite进行数据写入,也会失败(在使用w和w+模式打开文件时会发生,使用a和a+模式就可以写入数据,可能是跟平台有关系,测试使用的是Windows),代码如下:

$handle = fopen("j:/test.txt","w+"); //读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之

if ( $handle ) {

$lock = true;

if( flock($handle,LOCK_SH ,$lock) ) { //使用共享锁定,其他请求可以直接进入

$data = fgets($handle);

Log::write("锁定成功,开始执行,读取数据为:".$data, Log::EMERG);

fwrite($handle,"test"); //无法写入,而且把之前数据清空

fclose($handle);

} else {

Log::write("锁定失败,开始执行", Log::EMERG);

}

}

默认情况下LOCK_SH模式锁定文件,则不会阻塞其他客户端的操作,LOCK_EX模式的锁定会阻塞其他客户端的操作

对于同一个文件的锁定,如果一个客户端已经执行了共享锁定,则其他客户端对他的独占锁定会阻塞,反之如果一个客户端执行了独占锁定,则其他客户端对它的共享读锁定会阻塞(如果使用了LOCK_NB则其他客户端会锁定失败)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值