我试图使用flock()函数阻止文件以避免覆盖错误,但计数器经常重置(可能是读取问题)。
numeri.txt(counter)
4895|533753
frame.php(PHP文件)
$filename="numeri.txt";
$contents=file_get_contents($filename);
if(($fp=@fopen($filename,'w'))!==false)
{
if(flock($fp,LOCK_EX))
{
$contents=explode("|",$contents);
$clicks=$contents[0];
$impressions=$contents[1]+1;
fwrite($fp,$clicks."|".$impressions);
flock($fp,LOCK_UN);
}
fclose($fp);
}
有时计数器返回“| 1”而不是“4895 | 533754”。
我该如何解决?
答案 0 :(得分:2)
如果两个线程几乎同时使用小延迟执行代码,第一个线程将打开文件进行写入并在锁定之前将其擦除。
第二个线程将读取空文件内容,等待锁定释放,然后覆盖正确的数据。
解决方案是打开不在“w”中的文件,而是在“a”或“c”模式下,然后使用fwrite,fseek和ftruncate。