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 相关文章推荐
第九节--绑定
Nov 16 PHP
从MySQL数据库表中取出随机数据的代码
Sep 05 PHP
smarty的保留变量问题
Oct 23 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
Apr 15 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
PHP防止表单重复提交的几种常用方法汇总
Aug 19 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
Oct 08 PHP
php邮件发送的两种方式
Apr 28 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
Aug 11 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 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
如何提高MYSQL数据库的查询统计速度 select 索引应用
2007/04/11 PHP
PHP strtotime函数详解
2009/12/18 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
2019/05/28 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
Python+matplotlib实现华丽的文本框演示代码
2018/01/22 Python
Django自定义用户认证示例详解
2018/03/14 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
对python中Json与object转化的方法详解
2018/12/31 Python
浅析python的Lambda表达式
2019/02/27 Python
深入了解Python在HDA中的应用
2019/09/05 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
文秘人员工作职责
2014/01/31 职场文书
安全检查管理制度
2014/02/02 职场文书
运动会标语
2014/06/21 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
《游戏公平》教学反思
2016/02/20 职场文书