函数: 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);
?>