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数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
带密匙的php加密解密示例分享
Jan 29 PHP
PHP命令行脚本接收传入参数的三种方式
Aug 20 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
ThinkPHP路由机制简介
Mar 23 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
Oct 20 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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中文字符截取防乱码
2008/03/28 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
js利用div背景,做一个竖线的效果。
2008/11/22 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
详解Web使用webpack构建前端项目
2017/09/23 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
Python实现分段线性插值
2018/12/17 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
Django实现内容缓存实例方法
2020/06/30 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
PyCharm+Miniconda3安装配置教程详解
2021/02/16 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
四风问题自查报告剖析材料
2014/02/08 职场文书
中国梦演讲稿3分钟
2014/08/19 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
PyTorch device与cuda.device用法
2022/04/03 Python