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 相关文章推荐
IIS下配置Php+Mysql+zend的图文教程
Dec 08 PHP
PHP5 操作MySQL数据库基础代码
Sep 29 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
PHP 正则表达式常用函数
Aug 17 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
Mar 18 PHP
php使用COPY函数更新配置文件的方法
Jun 18 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
PHP实现登录验证码校验功能
May 17 PHP
PHP封装的分页类与简单用法示例
Feb 25 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 checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
Python的词法分析与语法分析
2013/05/18 Python
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
Java的基础面试题附答案
2016/01/10 面试题
职业规划书如何设计?
2014/01/09 职场文书
小学生环保演讲稿
2014/04/25 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
新员工入职欢迎词
2015/01/23 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
Log4j.properties配置及其使用
2021/08/02 Java/Android