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中计算未知长度的字符串哪个字符出现的次数最多的代码
Aug 14 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
zf框架的registry(注册表)使用示例
Mar 13 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
php+mysql实现无限分类实例详解
Jan 15 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
ucenter中词语过滤原理分析
Jul 13 PHP
Yii核心验证器api详解
Nov 23 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
thinkPHP5框架路由常用知识点汇总
Sep 15 PHP
PHP sdk实现在线打包代码示例
Dec 09 PHP
PHP高并发和大流量解决方案整理
Mar 09 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
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
PHP分页函数代码(简单实用型)
2010/12/02 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
TFDN图片播放器 不错自动播放
2006/10/03 Javascript
js验证表单第二部分
2006/11/25 Javascript
this[] 指的是什么内容 讨论
2007/03/24 Javascript
javascript中的几个运算符
2007/06/29 Javascript
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
EsLint入门学习教程
2017/02/17 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
原生JS实现天气预报
2020/06/16 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
python操作 hbase 数据的方法
2016/12/18 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
网络编辑岗位职责范本
2014/02/10 职场文书
优秀团队获奖感言
2014/02/19 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
师德师风承诺书
2014/05/23 职场文书
收银员岗位职责范本
2015/04/07 职场文书
力克胡哲观后感
2015/06/10 职场文书
法院执行局工作总结
2015/08/11 职场文书
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis