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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
PHP 字符串操作入门教程
Dec 06 PHP
php 模拟POST提交的2种方法详解
Jun 17 PHP
PHP和C#可共用的可逆加密算法详解
Oct 26 PHP
php实现微信发红包
Dec 05 PHP
thinkPHP3.1验证码的简单实现方法
Apr 22 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
php使用curl详细解析及问题汇总
Aug 11 PHP
thinkphp关于简单的权限判定方法
Apr 03 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 PHP
php中用unset销毁变量并释放内存
May 10 PHP
PHP7 windows支持
Mar 09 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面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
jQuery中is()方法用法实例
2015/01/06 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
老生常谈js数据类型
2017/08/03 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
Python字符转换
2008/09/06 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
客服文员岗位职责
2013/11/29 职场文书
自我评价中英文语句
2013/11/30 职场文书
拓展培训心得体会
2014/01/04 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
运动会方队口号
2014/06/07 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
六年级小学生评语
2014/12/26 职场文书
2016党员三严三实心得体会
2016/01/15 职场文书