我有一个新来的人(隔壁的少年)写一些php代码来跟踪我的网站上的一些用法。我不熟悉php,所以我想问一下有关并发文件访问的问题。
我的本机应用程序(在Windows上)偶尔会通过点击包含我的php脚本的URL将一些数据记录到我的站点。本机应用程序不检查返回的数据。
$fh = fopen($updateFile, 'a') or die("can't open file"); fwrite($fh, $ip); fwrite($fh, ', '); fwrite($fh, $date); fwrite($fh, ', '); fwrite($fh, implode(', ', $_GET)); fwrite($fh, "\r\n"); fclose($fh);
这是一个人流量低的站点,并且数据并不重要。但是,如果两个用户发生冲突并且脚本的两个实例各自尝试向该文件添加一行,会发生什么?PHP中是否有任何隐式文件锁定?
上面的代码至少可以防止锁定并且永远不会将控制权交还给我的用户吗?文件会损坏吗?如果我上面的脚本每个月都删除文件,那么如果该脚本的另一个实例正在写入文件,该怎么办?
您应该在文件上加锁:
<?php $fp = fopen($updateFile, 'w+'); if(flock($fp, LOCK_EX)) { fwrite($fp, 'a'); flock($fp, LOCK_UN); } else { echo 'can\'t lock'; } fclose($fp);