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的安全策略
Oct 09 PHP
怎样在php中使用PDF文档功能
Oct 09 PHP
经典的PHPer为什么被认为是草根?
Apr 02 PHP
优化PHP代码的53条建议
Mar 27 PHP
PHP实现多条件查询实例代码
Jul 17 PHP
php中json_encode中文编码问题分析
Sep 13 PHP
修改WordPress中文章编辑器的样式的方法详解
Dec 15 PHP
crontab无法执行php的解决方法
Jan 25 PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 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/07/17 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
javascript options属性集合操作代码
2009/12/28 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
Js自定义多选框效果的实例代码
2017/07/05 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
2019/11/12 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
python实现百度关键词排名查询
2014/03/30 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
Python实现的归并排序算法示例
2017/11/21 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
Python如何实现邮件功能
2020/05/27 Python
python中sys模块是做什么用的
2020/08/16 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
数控专业大学生的自我鉴定
2013/11/13 职场文书
大学生职业生涯规划书模板
2014/01/03 职场文书
公务员转正考察材料
2014/02/07 职场文书
会计岗位职责范本
2015/04/02 职场文书
污染环境建议书
2015/09/14 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
python绘图subplots函数使用模板的示例代码
2021/04/30 Python
python析构函数用法及注意事项
2021/06/22 Python
MySQL查询日期时间
2022/05/15 MySQL
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python