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中使用sockets:从新闻组中获取文章
Oct 09 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
php中实现简单的ACL 完结篇
Sep 07 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 PHP
php实现图片添加水印功能
Feb 13 PHP
微信营销平台系统?刮刮乐的开发
Jun 10 PHP
PHP之预定义接口详解
Jul 29 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
PHP对象链式操作实现原理分析
Oct 09 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
Mar 15 PHP
Laravel 自带的Auth验证登录方法
Sep 30 PHP
浅谈laravel框架与thinkPHP框架的区别
Oct 23 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
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
2011/07/31 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
Python模块文件结构代码详解
2018/02/03 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
Python日志器使用方法及原理解析
2020/09/27 Python
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
酒店司机岗位职责
2013/12/14 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
同学聚会邀请函
2015/01/30 职场文书
结婚老公保证书
2015/02/26 职场文书
起诉书范文
2015/05/20 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
golang生成并解析JSON
2022/04/14 Golang
SQL语句多表联合查询的方法示例
2022/04/18 MySQL
德生2P3收音机开箱评测
2022/04/30 无线电