IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

php中读写文件时锁的使用

排头兵-互联网开发实践 2010-01-20 09:17:45 累计浏览 3,851 次
本机暂存

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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,269)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  3. 一种常见的并发编程场景的处理 (累计阅读 23,588)
  4. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  5. 无锁消息队列 (累计阅读 14,276)
  6. 我的PHP,Python和Ruby之路 (累计阅读 13,147)
  7. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,789)
  8. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  9. 一种高效无锁内存队列的实现 (累计阅读 12,095)
  10. Redis消息队列的若干实现方式 (累计阅读 12,088)