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 相关文章推荐
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
Jul 09 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
May 04 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
Jul 23 PHP
php数组的概述及分类与声明代码演示
Feb 26 PHP
PHP实现生成唯一编号(36进制的不重复编号)
Jul 01 PHP
Zend Framework连接Mysql数据库实例分析
Mar 19 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
PHP使用xpath解析XML的方法详解
May 20 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
php探针使用原理和技巧讲解
Sep 17 PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 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树型类实例
2014/12/05 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
javascript 写类方式之八
2009/07/05 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
百度地图api如何使用
2015/08/03 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
在Django的session中使用User对象的方法
2015/07/23 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
Python Selenium参数配置方法解析
2020/01/19 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
宿舍使用违章电器检讨书
2014/01/12 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
信息合作协议书
2014/10/09 职场文书
工程资料员岗位职责
2015/04/13 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书