我让一个新手(隔壁的青少年)写了一些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中有没有隐式的文件锁定?
上面的代码至少不会被锁定并且永远不会将控制权交还给我的用户吗?文件会被损坏吗?如果我让上面的脚本每月删除该文件,如果该脚本的另一个实例正在向该文件写入,会发生什么情况?
发布于 2011-03-27 21:11:48
您应该在文件上设置一个锁:
<?php
$fp = fopen($updateFile, 'w+');
if(flock($fp, LOCK_EX)) {
fwrite($fp, 'a');
flock($fp, LOCK_UN);
} else {
echo 'can\'t lock';
}
fclose($fp);
发布于 2011-05-05 22:36:15
由于这是对文件的追加,最好的方法是聚合数据并在一个fwrite()中将其写入文件,前提是要写入的数据不大于文件缓冲区。当然,您并不总是知道缓冲区的大小,所以flock();总是一个很好的选择。
https://stackoverflow.com/questions/5449395
复制相似问题