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的FTP学习(四)
Oct 09 PHP
详解PHP显示MySQL数据的三种方法
Jun 05 PHP
php学习笔记 数组的常用函数
Jun 13 PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 PHP
phpize的深入理解
Jun 03 PHP
php网站地图生成类示例
Jan 13 PHP
PHP Curl出现403错误的解决办法
May 29 PHP
Yii编程开发常见调用技巧集锦
Jul 15 PHP
PHP错误和异常处理功能模块示例
Nov 12 PHP
PHP的中使用非缓冲模式查询数据库的方法
Feb 05 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP convert_cyr_string()函数讲解
Feb 13 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安全配置方法
2007/06/16 PHP
php htmlentities和htmlspecialchars 的区别
2008/08/18 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
php不写闭合标签的好处
2014/03/04 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
OpenCV读取与写入图片的实现
2020/10/13 Python
浅谈HTML5 &amp; CSS3的新交互特性
2016/07/19 HTML / CSS
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
奥林匹克的口号
2014/06/13 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
关于MySQL中的 like操作符详情
2021/11/17 MySQL