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模板类代码
Sep 07 PHP
php笔记之:数据类型与常量的使用分析
May 14 PHP
php 中文字符串首字母的获取函数分享
Nov 04 PHP
Thinkphp中import的几个用法详细介绍
Jul 02 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
php实现插入排序
Mar 29 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
php插入含有特殊符号数据的处理方法
Nov 24 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
PHP实现文件上传操作和封装
Mar 04 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 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的类树(支持无限分类)
2006/10/09 PHP
PHP学习之PHP运算符
2006/10/09 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
PHP缓冲区用法总结
2016/02/14 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
element-ui中el-upload多文件一次性上传的实现
2020/12/02 Javascript
python输出指定月份日历的方法
2015/04/23 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
基于python实现文件加密功能
2020/01/06 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
Python super()方法原理详解
2020/03/31 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
农场厂长岗位职责
2013/12/28 职场文书
创业融资计划书
2014/04/25 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
博士论文答辩开场白
2015/06/01 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书