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中多维数组按指定value排序的实现代码
Aug 19 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
php+jQuery.uploadify实现文件上传教程
Dec 26 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
PHP引用的调用方法分析
Apr 25 PHP
PHP调试及性能分析工具Xdebug详解
Feb 09 PHP
php上传excel表格并获取数据
Apr 27 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
基于PHP的简单采集数据入库程序
2014/07/30 PHP
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
2020/03/03 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
python支持断点续传的多线程下载示例
2014/01/16 Python
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
四种会话跟踪技术
2015/05/20 面试题
信息管理专业学生自荐信格式
2013/09/22 职场文书
会计系毕业个人自荐信格式
2013/09/23 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
公司踏青活动方案
2014/08/16 职场文书
酒店前台辞职书
2015/02/26 职场文书
酒桌上的开场白
2015/06/01 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python