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脚本代码
Feb 19 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
PHP 第二节 数据类型之数值型
Apr 28 PHP
PHP高级编程实例:编写守护进程
Sep 02 PHP
php选择排序法实现数组排序实例分析
Feb 16 PHP
Zend Framework分页类用法详解
Mar 22 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
微信利用PHP创建自定义菜单的方法
Aug 01 PHP
PHP获取不了React Native Fecth参数的解决办法
Aug 26 PHP
Yii2表单事件之Ajax提交实现方法
May 04 PHP
Laravel中服务提供者和门面模式的入门介绍
Nov 06 PHP
用PHP做了一个领取优惠券活动的示例代码
Jul 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
请离开include_once和require_once
2013/07/18 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
popdiv
2006/07/14 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
python 常用的基础函数
2018/07/10 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
成教自我鉴定
2013/10/27 职场文书
家长寄语大全
2014/04/02 职场文书
领导干部对照检查材料
2014/08/24 职场文书
测量员岗位职责
2015/02/14 职场文书
小学中队长竞选稿
2015/11/20 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
Python requests用法和django后台处理详解
2022/03/19 Python