PHP实现对文件锁进行加锁、解锁操作的方法


Posted in PHP onJuly 04, 2017

本文实例讲述了PHP实现对文件锁进行加锁、解锁操作的方法。分享给大家供大家参考,具体如下:

在项目中,一般都用到日志,如数据库查询日志、访问日志、对外接口请求返回参数日志,在处理日志时简单的写法如下

$file = 'log.txt';
$fp = fopen($file, 'a+');
if(!is_writable($file)){
  die("The $file is not writable!");
}
fwrite($fp, 'here');
fclose($fp);

但这种写法是由瑕疵的,一个网站同一时间并不是只有一个用户访问的,在多个用户同时访问时,就会出现问题,也就是多个进程使用同一个资源时,前一个进程写到一半后面的进程便开始写了,因此最后生成的日志就乱了。这种情况下,就用到锁了,在文件加锁期间,其他进程是不会修改文件的,只有当文件解锁时,才可以操作。写法如下

$file = 'log.txt';
$fp = fopen($file, 'a+');
if(!is_writable($file)){
  exit("The $file is not writable!");
}
flock($fp, LOCK_EX);// 加锁
fwrite($fp, 'here');
flock($fp, LOCK_UN);// 解锁
fclose($fp);

如果想测试下在文件加锁期间其他进程操作不了文件的例子,可以用下面给出的demo

log.php

$file = 'log.txt';
$fp = fopen($file, 'a+');
if(!is_writable($file)){
  exit("The $file is not writable!");
}
flock($fp, LOCK_EX);
fwrite($fp, 'here');
sleep(10);
flock($fp, LOCK_UN);
fclose($fp);

test.php

$file = 'lock.txt';
$fp = fopen($file, 'a');
fwrite($fp, 'good'); // 在sleep期间写不进去
fclose($fp);
// 或是直接使用下面的这个例子,发现在sleep期间打印是个空值
//var_dump(file_get_contents($file));

测试时,先运行log.php,再运行test.php,会发现在sleep期间,test.php是执行达不到效果的。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 PHP
如何使用PHP批量去除文件UTF8 BOM信息
Aug 05 PHP
析构函数与php的垃圾回收机制详解
Oct 28 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
Aug 20 PHP
PHP合并静态文件详解
Nov 14 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
PHP中绘制图像的一些函数总结
Nov 19 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
PHP连接操作access数据库实例
Mar 30 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
PHP连接MySQL数据库三种实现方法
Dec 10 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 #PHP
PHP错误处理函数register_shutdown_function使用示例
Jul 03 #PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 #PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 #PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 #PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 #PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 #PHP
You might like
PHP数据库开发知多少
2006/10/09 PHP
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
php完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
requireJS使用指南
2016/04/27 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
python 多线程应用介绍
2012/12/19 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
商务邀请函范文
2014/01/14 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
质量整改通知单
2015/04/21 职场文书
同事欢送会致辞
2015/07/31 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript