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 静态变量的初始化
Nov 15 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
Mar 18 PHP
php获取Google机器人访问足迹的方法
Apr 15 PHP
php+ajax无刷新分页实例详解
Dec 07 PHP
PHP序列化操作方法分析
Sep 28 PHP
thinkPHP统计排行与分页显示功能示例
Dec 02 PHP
Yii框架弹出框功能示例
Jan 07 PHP
yii2 resetful 授权验证详解
May 18 PHP
使用Zttp简化Guzzle 调用
Jul 02 PHP
利用laravel+ajax实现文件上传功能方法示例
Aug 13 PHP
php无限极分类实现方法分析
Jul 04 PHP
关于PHP求解三数之和问题详析
Nov 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
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
jquery 笔记 事件
2011/11/02 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
JavaScript指定断点操作实例教程
2018/09/18 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
django的分页器Paginator 从django中导入类
2019/07/25 Python
django的model操作汇整详解
2019/07/26 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
农民入党思想汇报
2014/01/03 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
2014年护士长工作总结
2014/11/11 职场文书