PHP使用flock实现文件加锁的方法


Posted in PHP onJuly 01, 2015

本文实例讲述了PHP使用flock实现文件加锁的方法。分享给大家供大家参考。具体分析如下:

flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows)。如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE。锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用)。

简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而防止冲突。举个例子:

<?php 
  $file = fopen("test.txt","w+"); 
  if (flock($file,LOCK_EX)) 
  { 
   fwrite($file,"Write something"); 
   flock($file,LOCK_UN); 
  } 
  else 
  { 
    echo "Error locking file!"; 
  } 
  fclose($file); 
?>

说明:

1.这段代码的意思是,以读写方式打开文件test.txt,当一个用户调用该php页面时,即对test.txt文件进行操作,那么就会执行flock($file,LOCK_EX)代码,即将test.txt文件进行独占锁定(该文件只能由该用户进行读写操作),那么如果有其他新的用户想访问该文件,就会被阻塞,直到前者关闭文件(释放锁定)。

2.如果将代码改成flock($file,LOCK_EX+LOCK_NB)表示锁定时直接返回错误,那么如果有新的用户访问该文件,就会输出“Error locking file!”

3.该函数的语法是flock(file,lock,block),其中file必需。规定要锁定或释放的已打开的文件。lock 必需。规定要使用哪种锁定类型。block可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。

例如:请写一段PHP代码,确保多个进程同时写入同一个文件成功

function writeData($path, $mode,$data) 
{ 
  $fp = fopen($path, $mode);  
  $retries = 0; 
  $max_retries = 100;  
  do{ 
    if ($retries > 0)  
    { 
      usleep(rand(1, 10000)); 
    } 
    $retries += 1; 
  }while (!flock($fp, LOCK_EX) and $retries<= $max_retries);  
  if ($retries == $max_retries)  
  { 
    return false; 
  } 
  fwrite($fp, "$data\n"); 
  flock($fp, LOCK_UN); 
  fclose($fp);  
  return true;  
}

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP配置心得包含MYSQL5乱码解决
Nov 20 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
Jun 24 PHP
php获取域名的google收录示例
Mar 24 PHP
PHP实现批量生成App各种尺寸Logo
Mar 19 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
Dec 21 PHP
php基于curl实现的股票信息查询类实例
Nov 11 PHP
php正则修正符用法实例详解
Dec 29 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
thinkPHP5框架设置404、403等http状态页面的方法
Jun 05 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 PHP
PHP+MYSQL中文乱码问题
Jul 01 #PHP
PHP+shell实现多线程的方法
Jul 01 #PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
Jul 01 #PHP
wamp服务器访问php非常缓慢的解决过程
Jul 01 #PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 #PHP
Smarty foreach控制循环次数的一些方法
Jul 01 #PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 #PHP
You might like
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
ext 代码生成器
2009/08/07 Javascript
html数组字符串拼接的最快方法
2009/09/16 Javascript
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
Django如何实现防止XSS攻击
2020/10/13 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
村捐赠仪式答谢词
2014/01/21 职场文书
档案保密承诺书
2014/06/03 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
2014年工商所工作总结
2014/12/09 职场文书
房屋维修申请报告
2015/05/18 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
入党心得体会
2019/06/20 职场文书