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 $_SERVER["REQUEST_URI"]获取值的通用解决方法
Jun 21 PHP
php中\r \r\n \t的区别示例介绍
Feb 08 PHP
smarty模板局部缓存方法使用示例
Jun 17 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
Oct 15 PHP
php+mysql大量用户登录解决方案分析
Dec 29 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
Nov 09 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
PHP未登录自动跳转到登录页面
Dec 21 PHP
PHP实现的数组和XML文件相互转换功能示例
Mar 15 PHP
php 截取中英文混合字符串的方法
May 31 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 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
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
PHP SQLite类
2009/05/07 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
Python出现segfault错误解决方法
2016/04/16 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
2014年五一活动策划方案
2014/03/15 职场文书
股票投资建议书
2014/05/19 职场文书
旅游文化节策划方案
2014/06/06 职场文书
公民授权委托书
2014/10/15 职场文书
离婚协议书范本
2015/01/26 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书