技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> PHP --> php中读写文件时锁的使用

php中读写文件时锁的使用

浏览:2942次  出处信息

php中很多函数在win32的情况下使用经常出现兼容性的问题,其中flock就是其中一个。

函数: flock(file,lock,block)

参数 描述
file 必需。规定要锁定或释放的已打开的文件。
lock 必需。规定要使用哪种锁定类型。
block 可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。

flock() 操作的 file 必须是一个已经打开的文件指针。

lock 参数可以是以下值之一:

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

被 lock_ex 后的文件 再以read模式 fopen 的话将读到空内容!!!

如果没有判断就把它当作空做操作后再写入就出错啦….

test1.php

以下是代码片段:

<?php

$fd = fopen(”./test.txt”, ”w”);
flock($fd, LOCK_EX);
sleep(20);
fwrite($fd, ”good”);
flock($fd, LOCK_UN);
fclose($fd);
?>

test2.php

以下是代码片段:
<?php
$fd = fopen(”./test.txt”, ”r”); 
echo fread($fd, 512); 
fclose($fd);
?>

test3.php

以下是代码片段:

<?php
$fd = fopen(”./test.txt”,”r”);
flock($fd,LOCK_EX);
echo fread($fd,512);
flock($fd,LOCK_UN);
fclose($fd);
?>

执行test1.php,然后执行test2.php,发现test2.php立即运行完成,内容为空。

执行test1.php,然后执行test3.php,发现test3.php会在test1.php执行之后获得内容。

貌似在使用fread的时候都必须使用flock,否则这个时候内容可能为空。

在PHP中经常会把数据库中的内容,通过php生成缓存文件,来减少数据库的负载压力。

以下是代码片段:

<?php

function writeCache(){}

function getCache(){

//加锁read

}

if(!getCache)

{

//执行SQL语句,然后再写入缓存

}

在php中fread的效率远高于fwrite的效率,因此在并发能力较大的情况下,缓存过期,导致大量请求到达后端Mysql上面可能会导致down机的情况发生,如何避免这种情况呢?当然,你可以采用memecached的主从缓存 ,通过时间切换来更新主从缓存的方式实现。

以下是代码片段:

<?php

function phpflock($dir)

{
$dir = md5($dir).’.php’;
flock($dir,LOCK_EX);
}

function phpunlock($dir)
{
$dir = md5($dir).’.php’;
flock($dir,LOCK_UN);
}
$dir =’/test.php’;
phplock(dir);
if(!getcache())
{
writeCache($dir);

phpunlock($dir);
?>

建议继续学习:

  1. 无锁消息队列    (阅读:12827)
  2. 海量小文件存储    (阅读:7560)
  3. 其实,文件也可以truncate    (阅读:7401)
  4. 并发编程系列之一:锁的意义    (阅读:5907)
  5. 无锁HashMap的原理与实现    (阅读:5354)
  6. 关于Linux的文件系统cache    (阅读:4796)
  7. MySQL锁管理(并发锁,行锁,表锁,预加锁,全局锁等等)    (阅读:4505)
  8. Perl 倒行分析文件方法。perl读文本文件,从末尾往前读.    (阅读:4440)
  9. 修改系统最大文件句柄数    (阅读:4281)
  10. PHP:从一个大文件第N行开始读取M行    (阅读:3943)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1