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产生随机字符串函数
Dec 06 PHP
IStream与TStream之间的相互转换
Aug 01 PHP
rephactor 优秀的PHP的重构工具
Jun 09 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
php操作xml
Oct 27 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
Jun 19 PHP
php数组合并array_merge()函数使用注意事项
Jun 19 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
Jul 01 PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 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
php利用cookies实现购物车的方法
2014/12/10 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
Prototype框架详解
2015/11/25 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
pytorch打印网络结构的实例
2019/08/19 Python
Django获取应用下的所有models的例子
2019/08/30 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
详解Python的三种拷贝方式
2020/02/11 Python
基于python实现音乐播放器代码实例
2020/07/01 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
python 实现图片裁剪小工具
2021/02/02 Python
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
母亲节演讲稿范文
2014/01/02 职场文书
竞聘上岗演讲稿范文
2014/01/10 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL