• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

PHP中的 flock 文件锁使用代码

PHP 水墨上仙 1577次浏览 0个评论

PHP中的 flock 文件锁使用代码

flock&nbsp
(PHP&nbsp4,&nbspPHP&nbsp5)&nbsp

flock&nbsp—&nbsp轻便的咨询文件锁定&nbsp

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

Note:&nbsp

在&nbspWindows&nbsp下&nbspflock()&nbsp将会强制执行。&nbsp

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

要取得共享锁定(读取的程序),将&nbspoperation&nbsp设为&nbspLOCK_SH(PHP&nbsp4.0.1&nbsp以前的版本设置为&nbsp1)。&nbsp
要取得独占锁定(写入的程序),将&nbspoperation&nbsp设为&nbspLOCK_EX(PHP&nbsp4.0.1&nbsp以前的版本中设置为&nbsp2)。&nbsp
要释放锁定(无论共享或独占),将&nbspoperation&nbsp设为&nbspLOCK_UN(PHP&nbsp4.0.1&nbsp以前的版本中设置为&nbsp3)。&nbsp
如果不希望&nbspflock()&nbsp在锁定时堵塞,则给&nbspoperation&nbsp加上&nbspLOCK_NB(PHP&nbsp4.0.1&nbsp以前的版本中设置为&nbsp4)。&nbsp

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

成功时返回&nbspTRUE,&nbsp或者在失败时返回&nbspFALSE.&nbsp

Example&nbsp#1&nbspflock()&nbsp例子&nbsp

<?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:&nbsp

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

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

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

语法:&nbsp

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

看下面代码:&nbsp

a.php&nbsp

<?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&nbsp

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

运行&nbspa.php&nbsp后,马上运行&nbspb.php&nbsp,可以看到输出:&nbsp
abc&nbsp
等&nbspa.php&nbsp运行完后运行&nbspb.php&nbsp,可以看到输出:&nbsp
abc&nbsp
123&nbsp
显然,当&nbspa.php&nbsp写文件时数据太大,导致时间比较长时,这时&nbspb.php&nbsp读取数据不完整,在对b.php做修改&nbsp
修改&nbspb.php&nbsp为:&nbsp

<?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); 
?> 

运行&nbspa.php&nbsp后,马上运行&nbspb.php&nbsp,可以发现&nbspb.php&nbsp会等到&nbspa.php&nbsp运行完成后(即&nbsp10&nbsp秒后)才显示:&nbsp
abc&nbsp
123&nbsp
读取数据完整,但时间过长,他要等待写锁释放,再对b.php做修改。&nbsp

修改&nbspb.php&nbsp为:&nbsp

<?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); 
?> 

运行&nbspa.php&nbsp后,马上运行&nbspb.php&nbsp,可以看到输出:&nbsp
Lock&nbspfile&nbspfailed…&nbsp
证明可以返回锁文件失败状态,而不是向上面一样要等很久。&nbsp

建议作文件缓存时,选好相关的锁,不然可能导致读取数据不完整,或重复写入数据。&nbsp
file_get_contents&nbsp好像选择不了锁,不知道他默认用的什么锁,反正和不锁得到的输出一样,是不完整的数据。


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明PHP中的 flock 文件锁使用代码
喜欢 (0)

您必须 登录 才能发表评论!

加载中……