PHP flock 文件锁详细介绍


Posted in PHP onDecember 29, 2012

flock
(PHP 4, PHP 5)

flock — 轻便的咨询文件锁定

说明
bool flock ( int $handle , int $operation [, int &$wouldblock ] )
PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。

Note:

在 Windows 下 flock() 将会强制执行。

flock() 操作的 handle 必须是一个已经打开的文件指针。operation 可以是以下值之一:

要取得共享锁定(读取的程序),将 operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。
要取得独占锁定(写入的程序),将 operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。
要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。
如果不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。

flock() 允许执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是 Windows)。如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为 TRUE。锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用)。

成功时返回 TRUE, 或者在失败时返回 FALSE.

Example #1 flock() 例子

<?php 
$fp = fopen("/tmp/lock.txt", "w+"); 
if (flock($fp, LOCK_EX)) { // 进行排它型锁定 
fwrite($fp, "Write something here "); 
flock($fp, LOCK_UN); // 释放锁定 
} else { 
echo "Couldn't lock the file !"; 
} 
fclose($fp); 
?>

Note:

由于 flock() 需要一个文件指针, 因此可能不得不用一个特殊的锁定文件来保护打算通过写模式打开的文件的访问(在 fopen() 函数中加入 "w" 或 "w+")。

Warning
flock() 不能用于 NFS 以及其它一些网络文件系统。详细资料查看自己操作系统的文档。
在部分操作系统中 flock() 以进程级实现。当用一个多线程服务器 API(比如 ISAPI)时,可能不可以依靠 flock() 来保护文件,因为运行于同一服务器实例中其它并行线程的 PHP 脚本可以对该文件进行处理。
flock() 不支持旧的文件系统,如 FAT 以及它的派生系统。因此,此环境下总是返回 FALSE(尤其是对 Windows 98 用户来说)。

php中文件锁函数flock函数用法简介:

语法:

bool flock ( int $handle , int $operation [, int &$wouldblock ] )
flock() 操作的 handle 必须是一个已经打开的文件指针。operation 可以是以下值之一:
1. 要取得共享锁定(读取程序),将 operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)
2. 要取得独占锁定(写入程序),将 operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)
3. 要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)
4. 如果你不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)

看下面代码:

a.php

<?php 
$file = “temp.txt”; 
$fp = fopen($file , 'w‘); 
if(flock($fp , LOCK_EX)){ 
fwrite($fp , “abc”); 
sleep(10); 
fwrite($fp , “123”); 
flock($fp , LOCK_UN); 
} 
fclose($fp); 
?>

b.php
<?php 
$file = “temp.txt”; 
$fp = fopen($file , 'r'); 
echo fread($fp , 100); 
fclose($fp); 
?>

运行 a.php 后,马上运行 b.php ,可以看到输出:
abc
等 a.php 运行完后运行 b.php ,可以看到输出:
abc
123
显然,当 a.php 写文件时数据太大,导致时间比较长时,这时 b.php 读取数据不完整,在对b.php做修改
修改 b.php 为:
<?php 
$file = “temp.txt”; 
$fp = fopen($file , 'r‘); 
if(flock($fp , LOCK_EX)){ 
echo fread($fp , 100); 
flock($fp , LOCK_UN); 
} else{ 
echo “Lock file failed…”; 
} 
fclose($fp); 
?>

运行 a.php 后,马上运行 b.php ,可以发现 b.php 会等到 a.php 运行完成后(即 10 秒后)才显示:
abc
123
读取数据完整,但时间过长,他要等待写锁释放,再对b.php做修改。
修改 b.php 为:
<?php 
$file = “temp.txt”; 
$fp = fopen($file , 'r'); 
if(flock($fp , LOCK_SH | LOCK_NB)){ 
echo fread($fp , 100); 
flock($fp , LOCK_UN); 
} else{ 
echo “Lock file failed…”; 
} 
fclose($fp); 
?>

运行 a.php 后,马上运行 b.php ,可以看到输出:
Lock file failed…
证明可以返回锁文件失败状态,而不是向上面一样要等很久。
三水点靠木小编结论:
建议作文件缓存时,选好相关的锁,不然可能导致读取数据不完整,或重复写入数据。
file_get_contents 好像选择不了锁,不知道他默认用的什么锁,反正和不锁得到的输出一样,是不完整的数据。
PHP 相关文章推荐
Discuz板块横排显示图片的实现方法
May 28 PHP
PHP DataGrid 实现代码
Aug 12 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
Mar 14 PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 PHP
php实现根据IP地址获取其所在省市的方法
Apr 30 PHP
php猴子选大王问题解决方法
May 12 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
[原创]PHP简单开启curl的方法(测试可行)
Jan 11 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
May 15 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
Oct 09 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 #PHP
PHP中函数rand和mt_rand的区别比较
Dec 26 #PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
Dec 21 #PHP
php和javascript之间变量的传递实现代码
Dec 19 #PHP
ajax php传递和接收变量实现思路及代码
Dec 19 #PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 #PHP
PHP获取http请求的头信息实现步骤
Dec 16 #PHP
You might like
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
利用php输出不同的心形图案
2016/04/22 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
捕获未处理的Promise错误方法
2017/10/13 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
Python中模块string.py详解
2017/03/12 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
对python函数签名的方法详解
2019/01/22 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
医学护理毕业生自荐信
2013/11/07 职场文书
金融专业推荐信
2013/11/14 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
公司离职证明标准样本
2014/10/05 职场文书
暑期社会实践证明书
2014/11/17 职场文书
面试感谢信范文
2015/01/22 职场文书
雾霾停课通知
2015/04/24 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫