PHP对文件进行加锁、解锁实例


Posted in PHP onJanuary 23, 2015

有时候你的php脚本或许需要线程安全的保证,比如进行文件写操作的时候。本文提供了文件加锁函数以及使用示例。文件加锁功能也可以用来获得独享的处理空间,防止脚本执行发生同步错误。

<?php

/*************************************************************************

*file lock

*@author Zeal Li

*http://www.zeali.net/

*

*************************************************************************/

/*

*lock_thisfile:获得独享锁

*@param $tmpFileStr 用来作为共享锁文件的文件名(可以随便起一个名字)

*@param $locktype 锁类型,缺省为false(非阻塞型,也就是一旦加锁失败则直接返回false),设置为true则会一直等待加锁成功才返回

*@return 如果加锁成功,则返回锁实例(当使用unlock_thisfile方法的时候需要这个参数),加锁失败则返回false.

*/
function lock_thisfile($tmpFileStr,$locktype=false){
    if($locktype == false)
        $locktype = LOCK_EX|LOCK_NB;
    $can_write = 0;
    $lockfp = @fopen($tmpFileStr.".lock","w");
    if($lockfp){
        $can_write = @flock($lockfp,$locktype);
    }
    if($can_write){
        return $lockfp;
    }
    else{
        if($lockfp){
            @fclose($lockfp);
            @unlink($tmpFileStr.".lock");
        }
        return false;
    }
}
/** 

*unlock_thisfile:对先前取得的锁实例进行解锁

*@param $fp lock_thisfile方法的返回值

*@param $tmpFileStr 用来作为共享锁文件的文件名(可以随便起一个名字)

*/

function unlock_thisfile($fp,$tmpFileStr){
    @flock($fp,LOCK_UN);
    @fclose($fp);
    @fclose($fp);
    @unlink($tmpFileStr.".lock");
}

?>
<?php
// 使用举例

$tmpFileStr = "/tmp/mylock.loc";

// 等待取得操作权限,如果要立即返回则把第二个参数设为false.

$lockhandle = lock_thisfile($tmpFileStr,true);

if($lockhandle){

    // 在这里进行所有需要独占的事务处理。

    // ... ...

    // 事务处理完毕。

    unlock_thisfile($lockhandle,$tmpFileStr);

}

?>

PHP 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
PHP 验证码的实现代码
Jul 17 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
Jan 06 PHP
php专用数组排序类ArraySortUtil用法实例
Apr 03 PHP
PHP超牛逼无限极分类生成树方法
May 11 PHP
PHP中的traits实现代码复用使用实例
May 13 PHP
php实现通过ftp上传文件
Jun 19 PHP
PHP数组生成XML格式数据的封装类实例
Nov 10 PHP
CI框架中类的自动加载问题分析
Nov 21 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
Oct 22 PHP
PHP callback函数使用方法和注意事项
Jan 23 #PHP
PHPExcel内存泄漏问题解决方法
Jan 23 #PHP
使用PHP生成PDF方法详解
Jan 23 #PHP
C# WinForm中实现快捷键自定义设置实例
Jan 23 #PHP
对PHP PDO的一些认识小结
Jan 23 #PHP
smarty模板引擎中自定义函数的方法
Jan 22 #PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 #PHP
You might like
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
关于Js中new操作符的作用详解
2021/02/21 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
Python文件去除注释的方法
2015/05/25 Python
Python如何为图片添加水印
2016/11/25 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
Python入门学习指南分享
2018/04/11 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
python实现翻译word表格小程序
2020/02/27 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
耐克中国官方商城:Nike中国
2018/10/18 全球购物
Android interview questions
2016/12/25 面试题
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
大学本科毕业生的自我鉴定
2013/11/26 职场文书
小学语文教学反思
2014/02/10 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
单身申明具结书
2015/02/26 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技