我有一个函数,它接收一个文件名和一个json对象来写入文本文件.
对象已更新,需要完全替换文件的当前内容.每个站点访问者都有自己的文件.多个快速更改会导致文件被截断fopen(file,w+),然后在锁定时不写入.最终结果是空文件.
我确信这是一种标准的简单方法,因为它是一种常见的活动.理想情况下,我正在寻找的方法是在使用fopenin 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;
}
}
Run Code Online (Sandbox Code Playgroud)
PHP手册中的示例#1 将通过略微修改完成您想要的操作.使用"c"模式打开文件进行写入,如果文件不存在则创建,不要截断.
$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);
Run Code Online (Sandbox Code Playgroud)
"c"模式的完整描述:
打开文件进行写入.如果该文件不存在,则创建该文件.如果存在,则既不截断(与'w'相反),也不会调用此函数失败(如'x'的情况).文件指针位于文件的开头.如果
flock()在尝试修改文件之前需要获取咨询锁(请参阅),这可能很有用,因为使用'w'可能会在获取锁之前截断文件(如果需要截断,则可以在之后使用ftruncate())请求锁定).
它看起来并不像你需要它,但是"c+"如果你想要读写它们,还有一个相应的模式.