-
群里大家一起交流:410028331
文件锁的玩法
1、普通两个文件同一时候往一个文件里写入内容效果
index-1.php
<?php
$file = 'temp.txt';
$fp = fopen($file,'a');
for($i = 0;$i <10;$i++)
{
fwrite($fp, "11111111<br />");
sleep(1);
}
fclose($fp);
?
>
index-2.php
<?php
$file = 'temp.txt';
$fp = fopen($file,'a');
for($i = 0;$i <10;$i++)
{
fwrite($fp, "22222222<br />");
}
fclose($fp);
?>
当同一时候运行后,(先1后2 要快立即运行两个)
进入temp.txt 会看到 11111111<br />11111111<br />22222222<br />22222222<br />22222222<br />22222222<br />22222222<br />11111111<br />11111111<br />11111111<br />
是混乱的。那么实际实现功能上就会出现故障。
?????????
那么这样的情况下。怎样实现并发对一个文件写入,而先来先写排序写入呢?
那么用到文件锁,这是一个非常好地选择
index-1.php改为
<?
php
$file = 'temp.txt';
$fp = fopen($file,'a');
if(flock($fp,LOCK_EX))
{
for($i = 0;$i <10;$i++)
{
fwrite($fp, "11111111<br />");
sleep(1);
}
flock($fp,LOCK_UN);
}
fclose($fp);
index-2.php改为:
<?php
$file = 'temp.txt';
$fp = fopen($file,'a');
if(flock($fp,LOCK_EX))
{
for($i = 0;$i <10;$i++)
{
fwrite($fp, "22222222<br />");
}
flock($fp,LOCK_UN);
}
fclose($fp);
再去运行发现temp.txt中的结果是这种(先1立即2,由于1有sleep会运行一段时间,仅仅要能保证1未完就运行了2就可以)
结果: 11111111<br />11111111<br /> ... 22222222<br />...
也就是1运行完了后运行的2