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 ADODB使用方法集锦
Mar 25 PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
UCenter 批量添加用户的php代码
Jul 17 PHP
基于php下载文件的详解
Jun 02 PHP
使用Linux五年积累的一些经验技巧
Jun 20 PHP
PHP实现合并discuz用户
Aug 05 PHP
php mongodb操作类 带几个简单的例子
Aug 25 PHP
PHP入门教程之表单与验证实例详解
Sep 11 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
php出租房数据管理及搜索页面
May 23 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 PHP
Git命令之分支详解
Mar 02 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
PHP 实现判断用户是否手机访问
2015/01/21 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
select标记美化--JS式插件、后期加载
2013/04/01 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现数独算法实例
2015/06/09 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
python 日期操作类代码
2018/05/05 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
基于python实现KNN分类算法
2020/04/23 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
初婚初育证明
2014/01/14 职场文书
市场部经理岗位职责
2014/04/10 职场文书
经典演讲稿开场白
2014/08/25 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
学习经验交流会策划书
2015/11/02 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL