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 23 PHP
Zend Studio去除编辑器的语法警告设置方法
Oct 24 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
php使用google地图应用实例
Dec 31 PHP
PHP中Session可能会引起并发问题
Jun 26 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
Laravel框架在本地虚拟机快速安装的方法详解
Jun 11 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 PHP
php实现JWT验证的实例教程
Nov 26 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
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
简单的分页代码js实现
2016/05/17 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
vue-父子组件和ref实例详解
2019/11/10 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
python实现计算资源图标crc值的方法
2014/10/05 Python
在Python下进行UDP网络编程的教程
2015/04/29 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
2017/06/23 Python
Python Socket使用实例
2017/12/18 Python
python实时监控cpu小工具
2018/06/21 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
python实现打砖块游戏
2020/02/25 Python
python redis存入字典序列化存储教程
2020/07/16 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
制冷与电控专业应届生求职信
2013/11/11 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
职工宿舍管理制度
2015/08/05 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android