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 读取和修改大文件的某行内容的代码
Oct 30 PHP
PHP中替换换行符的几种方法小结
Oct 15 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
Feb 18 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
Sep 23 PHP
php类声明和php类使用方法示例分享
Mar 29 PHP
smarty模板局部缓存方法使用示例
Jun 17 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
PHP中加密解密函数与DES加密解密实例
Oct 17 PHP
PHP准确取得服务器IP地址的方法
Jun 02 PHP
Yii2增加验证码步骤详解
Apr 25 PHP
php array_keys 返回数组的键名
Oct 25 PHP
PHP进阶学习之依赖注入与Ioc容器详解
Jun 19 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二维数组用键名分组相加实例函数
2013/11/06 PHP
php实现监听事件
2013/11/06 PHP
十大使用PHP框架的理由
2015/09/26 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
php curl发送请求实例方法
2019/08/01 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
再谈JavaScript线程
2015/07/10 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
js实现一个简易计算器
2020/03/30 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
改进Django中的表单的简单方法
2015/07/17 Python
PyQt5实现拖放功能
2018/04/25 Python
Python单元测试与测试用例简析
2019/11/09 Python
wxPython实现文本框基础组件
2019/11/18 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
儿科护士实习自我鉴定
2013/10/17 职场文书
《乌塔》教学反思
2014/02/17 职场文书
班主任新年寄语
2014/04/04 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
党性分析材料格式
2014/12/19 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers