php 文件锁

当写为LOCK_EX锁 且 读为LOCK_SH锁时最为妥当,经测试,这时情况如下:

1, 先运行w.php,马上支行r.php 后 程序会先等写入后再读取

2, 先运行r.php,再马上支行w.php后 当写操作执行LOCK_EX时就已经把文件内容清空,LOCK_SH并不会影响写操作清空,也就是说具体流程如下: 

  a) 运行r.php ,加LOCK_SH锁 , 马上支行w.php,加LOCK_SH,文件被清空

     b) 等待r.php读出为空,运行完毕后,w.php再开始运行,完毕

3,如果将第二步中的w.php中的 fwrite换成a就可以先读出原有的,等读完后,写才执行

 

4,如果两个都读 或都写,那么就按 先后顺序等待执行

其中很像队列机制

最后解决办法,在同一锁内读后再写,可以解决并发冲突:

 

<?php
@ini_set('implicit_flush',1);
ob_implicit_flush(1);
@ob_end_clean();


$file = "temp.txt";
$fp = fopen($file, 'r+');
flock($fp, LOCK_EX) or die("lock error");

echo '<br />LOCK_EX 哥先读5s....';

for ($i=5; $i>0; --$i)
{
echo $i;
sleep(1);
}

echo '<br />'.fread($fp, 100);
echo '<br /> 被读了出来 ,LOCK_UN';

fwrite($fp ,'#'); //然后指针到文件尾,此时再写入文件尾部
echo '<br />#';
flock($fp, LOCK_UN);
fclose($fp);
?>

--------------以上是把在文件末尾加新写入的内容----------------
有的时候我们需要将写入的内容写在文件头(当然由于指针问题会覆盖):
<?php
//计算文件大小
echo filesize('temp.txt');
$fp = fopen('temp.txt', 'r+');

flock($fp, LOCK_EX);
fwrite($fp, '10001');
sleep(2);
$str = fread($fp , 1024 * 100);
echo 'content : ' . $str;


flock($fp, LOCK_UN);
?>
这时候的好处是文件的大小不会变大,方便打开和读取,我在计算幸运数据为减轻服务器压力就是这样写的
posted @ 2016-11-12 12:06  yubolin  阅读(297)  评论(0编辑  收藏  举报