php 读锁,php中读写文件时锁的使用

php中读写文件时锁的使用

作者:PHPYuan 时间:2018-09-28 03:41:36

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

以下是代码片段:

$fd = fopen(”./test.txt”, ”w”);

flock($fd, LOCK_EX);

sleep(20);

fwrite($fd, ”good”);

flock($fd, LOCK_UN);

fclose($fd);

?>

test2.php

以下是代码片段:

$fd = fopen(”./test.txt”, ”r”);

echo fread($fd, 512);

fclose($fd);

?>test3.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生成缓存文件,来减少数据库的负载压力。

以下是代码片段:

function writeCache(){}

function getCache(){

//加锁read

}

if(!getCache)

{

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

}

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

以下是代码片段:

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

?>

分享到:

<< 上一篇:什么是伪静态?网站伪静态有什么作用? (2018-09-28 03:41)

>> 下一篇:PHP连接数据库实现登录 (2018-09-27 03:41)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值