我有一个函数接收文件名和json对象来写入文本文件。
对象已更新,需要完全替换文件的当前内容。每个站点访问者都有自己的文件。多个快速更改会导致文件被fopen(file,w+)
截断,然后在锁定时不会写入。最终结果是空文件。
我确信有一种标准的简单方法可以做到这一点,因为这是一种常见的活动。理想情况下,我正在寻找的方法是在fopen
模式下使用w+
截断文件或切换模式之前检查文件是否具有锁定。
似乎很奇怪你必须用fopen()
截断文件来获取文件句柄以传递给flock()
以检查它是否被锁定 - 但你只是截断了它,所以重点是什么?
这是我到目前为止的功能:
function updateFile($filename, $jsonFileData) {
$fp = fopen($filename,"w+");
if (flock($fp, LOCK_EX)) {
fwrite($fp, $jsonFileData);
flock($fp, LOCK_UN);
fclose($fp);
return true;
} else {
fclose($fp);
return false;
}
}
答案 0 :(得分:8)
来自PHP manual的示例#1将通过略微修改完成您想要的操作。使用"c"
mode打开要写入的文件,如果它不存在则创建它,并且不要截断它。
$fp = fopen("/tmp/lock.txt", "c");
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
ftruncate($fp, 0); // truncate file
fwrite($fp, "Write something here\n");
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
"c"
mode的完整说明:
打开文件进行写作。如果该文件不存在,则创建该文件。如果存在,则既不截断(与'w'相反),也不会调用此函数失败(如'x'的情况)。文件指针位于文件的开头。如果在尝试修改文件之前需要获取咨询锁(请参阅
flock()
),这可能很有用,因为使用'w'可能会在获取锁之前截断文件(如果需要截断,则为ftruncate()可以在请求锁定后使用。)
它看起来不像你需要它,但是如果你想要读写它们,还有一个相应的"c+"
模式。