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 相关文章推荐
php调用mysql存储过程
Feb 14 PHP
在任意字符集下正常显示网页的方法一
Apr 01 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
Jun 05 PHP
php实现快速排序法函数代码
Aug 27 PHP
PHP图片上传代码
Nov 04 PHP
php实现下载限制速度示例分享
Feb 13 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
Jun 10 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
Yii框架上传图片用法总结
Mar 28 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
Laravel ORM 数据model操作教程
Oct 21 PHP
php中get_object_vars()在数组的实例用法
Feb 22 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
MyEclipse常用配置图文教程
2014/09/11 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
videocapture库制作python视频高速传输程序
2013/12/23 Python
Python pandas常用函数详解
2018/02/07 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
python实现车牌识别的示例代码
2019/08/05 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
办公室文秘岗位职责
2013/11/15 职场文书
升学宴主持词
2014/04/02 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
四风之害观后感
2015/06/09 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL