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 相关文章推荐
PR值查询 | PageRank 查询
Dec 20 PHP
drupal 代码实现URL重写
May 04 PHP
php页面防重复提交方法总结
Nov 25 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
Jun 12 PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 PHP
PHP使用xmllint命令处理xml与html的方法
Dec 15 PHP
ecshop后台编辑器替换成ueditor编辑器
Mar 03 PHP
php银联网页支付实现方法
Mar 04 PHP
详解PHP中websocket的使用方法
Sep 15 PHP
php ajax confirm 删除实例详解
Mar 06 PHP
php实现微信和支付宝支付的示例代码
Aug 11 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
Sep 13 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学习之PHP表达式
2006/10/09 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
jQuery实现简单弹窗遮罩效果
2017/02/27 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
angular第三方包开发整理(小结)
2018/04/19 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
关于Keras Dense层整理
2020/05/21 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
数据库笔试题
2013/05/09 面试题
行政经理岗位职责
2013/11/09 职场文书
高二英语教学反思
2014/01/19 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
工作收入住址证明
2014/10/28 职场文书
师德师风事迹材料
2014/12/20 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS