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与javascript对多项选择的处理
Oct 09 PHP
编写PHP的安全策略
Oct 09 PHP
二十行语句实现从Excel到mysql的转化
Oct 09 PHP
用PHP和ACCESS写聊天室(十)
Oct 09 PHP
用php实现像JSP,ASP里Application那样的全局变量
Jan 12 PHP
用PHP+MySQL搭建聊天室功能实例代码
Aug 20 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
php缓冲 output_buffering和ob_start使用介绍
Jan 30 PHP
PHP实现的连贯操作、链式操作实例
Jul 08 PHP
PHP中__FILE__、dirname与basename用法实例分析
Dec 01 PHP
Symfony2实现在doctrine中内置数据的方法
Feb 05 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 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 数字左侧自动补0
2008/03/31 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php中批量替换文件名的实现代码
2011/07/20 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
python回调函数中使用多线程的方法
2017/12/25 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
python Tkinter版学生管理系统
2019/02/20 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
医科大学生毕业的自我评价分享
2013/11/12 职场文书
业务助理岗位职责
2013/11/18 职场文书
优秀毕业生求职推荐信范文
2013/11/21 职场文书
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
外企求职信范文分享
2013/12/31 职场文书
电大本科自我鉴定
2014/02/05 职场文书
《故乡》教学反思
2014/04/10 职场文书
服务理念口号
2014/06/11 职场文书
三方股东合作协议书
2014/10/28 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript