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转成EXE文件
Oct 09 PHP
一个用php实现的获取URL信息的类
Jan 02 PHP
ThinkPHP实现一键清除缓存方法
Jun 26 PHP
为你总结一些php信息函数
Oct 21 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP实现的简单分页类及用法示例
May 06 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
Yii2框架数据库简单的增删改查语法小结
Aug 31 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 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
聊天室php&mysql(四)
2006/10/09 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
JS实现商品倒计时实现代码
2013/05/03 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
2014/07/18 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
Vue.js划分组件的方法
2017/10/29 Javascript
vue实现文件上传功能
2018/08/13 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
跟老齐学Python之做一个小游戏
2014/09/28 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
英国网上超市:Ocado
2020/03/05 全球购物
优秀学生自我鉴定范例
2013/12/18 职场文书
2014年情人节活动方案
2014/02/16 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
个人优缺点总结
2015/02/28 职场文书
2019辞职报告范本3篇!
2019/07/23 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
vue实现Toast组件轻提示
2022/04/10 Vue.js