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中通过curl smtp发送邮件
Jun 05 PHP
PHP+MySQL投票系统的设计和实现分享
Sep 23 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
Jun 18 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
php实现快速排序的三种方法分享
Mar 12 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
May 13 PHP
使用URL传输SESSION信息
Jul 14 PHP
PHP 7.1新特性的汇总介绍
Dec 16 PHP
PC端微信扫码支付成功之后自动跳转php版代码
Jul 07 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 PHP
浅谈Laravel中使用Slack进行异常通知
May 29 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
留言板翻页的实现详解
2006/10/09 PHP
php读取html并截取字符串的简单代码
2009/11/30 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
YII框架常用技巧总结
2019/04/27 PHP
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
在Django中限制已登录用户的访问的方法
2015/07/23 Python
python+Django+apache的配置方法详解
2016/06/01 Python
详解python eval函数的妙用
2017/11/16 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
Numpy 多维数据数组的实现
2020/06/18 Python
python如何查看安装了的模块
2020/06/23 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
任意存:BOXFUL
2018/05/21 全球购物
英智兴达软件测试笔试题
2016/10/12 面试题
毕业生的求职信范文分享
2013/12/04 职场文书
幼儿园教师请假制度
2014/01/16 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
2014年应急工作总结
2014/12/11 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
业务内勤岗位职责
2015/04/13 职场文书
校长新学期寄语2016
2015/12/04 职场文书