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 相关文章推荐
第八节--访问方式
Nov 16 PHP
php基础知识:控制结构
Dec 13 PHP
使用Xdebug调试和优化PHP程序之[1]
Apr 17 PHP
php下实现在指定目录搜索指定类型文件的函数
Oct 03 PHP
php Smarty date_format [格式化时间日期]
Mar 15 PHP
php中判断文件空目录是否有读写权限的函数代码
Aug 07 PHP
PHP中操作ini配置文件的方法
Apr 25 PHP
php.ini 配置文件的深入解析
Jun 17 PHP
php+ajax实现无刷新的新闻留言系统
Dec 21 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
Jul 20 PHP
php实现和c#一致的DES加密解密实例
Jul 24 PHP
PHP异步进程助手async-helper
Feb 05 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错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
javascript delete 使用示例代码
2010/03/29 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
flask项目集成swagger的方法
2020/12/09 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
军训自我鉴定100字
2014/02/13 职场文书
股东协议书
2014/04/14 职场文书
赡养老人协议书
2014/04/21 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
青年文明号申报材料
2014/12/23 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
单位实习介绍信
2015/05/05 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
zabbix监控mysql的实例方法
2021/06/02 MySQL