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中上传大体积文件时需要的设置
Oct 09 PHP
php 方便水印和缩略图的图形类
May 21 PHP
深入理解PHP原理之异常机制
Aug 21 PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 PHP
一组PHP加密解密函数分享
Jun 05 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
PHP中Enum(枚举)用法实例详解
Dec 07 PHP
Yii2框架实现注册和登录教程
Sep 30 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 PHP
php设计模式之工厂模式用法经典实例分析
Sep 20 PHP
PHP解决高并发问题
Apr 01 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中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
javascript实现信息的显示和隐藏如注册页面
2013/12/03 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
Python中正则表达式的用法总结
2019/02/22 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
python实现连连看游戏
2020/02/14 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
django的403/404/500错误自定义页面的配置方式
2020/05/21 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
面向对象概念面试题(.NET)
2016/11/04 面试题
高中运动会入场词
2014/02/14 职场文书
绿色环保演讲稿
2014/05/10 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
公司管理制度范本
2015/08/03 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
Mysql Show Profile
2021/04/05 MySQL
Mysql 如何查询时间段交集
2021/06/08 MySQL
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript
create-react-app开发常用配置教程
2022/06/25 Javascript
MySQL存储过程及语法详解
2022/08/05 MySQL