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中通过ADODB库实现调用Access数据库之修正版本
Dec 31 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
PHP提示Notice: Undefined variable的解决办法
Nov 24 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
php include和require的区别深入解析
Jun 17 PHP
解析centos中Apache、php、mysql 默认安装路径
Jun 25 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
PHP简单实现无限级分类的方法
May 13 PHP
Yii2中SqlDataProvider用法示例
Sep 22 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
PHP实现与java 通信的插件使用教程
Aug 11 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有道翻译api调用方法实例
2014/12/22 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
JS自定义选项卡函数及用法实例分析
2015/09/02 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
python查询mysql中文乱码问题
2014/11/09 Python
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
78行Python代码实现现微信撤回消息功能
2018/07/26 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
python中如何设置代码自动提示
2020/07/15 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
小学生自我评价范例
2013/09/24 职场文书
顶岗实习接收函
2014/01/09 职场文书
商业门面租房协议书
2014/11/25 职场文书
教师工作表现评语
2014/12/31 职场文书
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL
Golang jwt身份认证
2022/04/20 Golang