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 相关文章推荐
模拟xcopy的函数
Oct 09 PHP
PHP中for循环语句的几种变型
Nov 26 PHP
phpMyAdmin链接MySql错误 个人解决方案
Dec 28 PHP
PHP数据过滤的方法
Oct 30 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
php字符集转换
Jan 23 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
Dec 14 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
解决laravel id非自增 模型取回为0 的问题
Oct 11 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 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 Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
PHP学习笔记之一
2011/01/17 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
PHP之图片上传类实例代码(加了缩略图)
2016/06/30 PHP
Jquery 常用方法经典总结
2010/01/28 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
基于vue组件实现猜数字游戏
2020/05/28 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
基于python实现简单日历
2018/07/28 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
NumPy中的维度Axis详解
2019/11/26 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
个人公开承诺书
2014/03/28 职场文书
城管大队整治方案
2014/05/06 职场文书
运动员获奖感言
2014/08/15 职场文书
学习三严三实心得体会
2014/10/13 职场文书
2014年社区工作总结
2014/11/18 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
高考1977观后感
2015/06/04 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
Python sklearn分类决策树方法详解
2022/09/23 Python
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL