Php fopen(file,w+;)会在检查文件是否';之前截断该文件;它和羊群锁在一起

Php fopen(file,w+;)会在检查文件是否';之前截断该文件;它和羊群锁在一起,php,fopen,flock,Php,Fopen,Flock,我有一个函数,它接收一个文件名和一个json对象以写入文本文件 对象已更新,需要完全替换文件的当前内容。每个站点访问者都有自己的文件。多次快速更改会造成文件被fopen(file,w+截断,然后由于锁定而不写入的情况。最终结果是空文件 我相信有一个标准的简单方法来做这件事,因为这是一个非常平常的活动。理想情况下,我要寻找的是一种在w+模式下使用fopen截断文件之前检查文件是否有锁的方法,或者一种切换模式的方法 奇怪的是,您必须使用fopen()截断文件,才能将文件句柄传递到flock()以检查

我有一个函数,它接收一个文件名和一个json对象以写入文本文件

对象已更新,需要完全替换文件的当前内容。每个站点访问者都有自己的文件。多次快速更改会造成文件被
fopen(file,w+
截断,然后由于锁定而不写入的情况。最终结果是空文件

我相信有一个标准的简单方法来做这件事,因为这是一个非常平常的活动。理想情况下,我要寻找的是一种在
w+
模式下使用
fopen
截断文件之前检查文件是否有锁的方法,或者一种切换模式的方法

奇怪的是,您必须使用
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;
    }
}
示例#中的1只需稍加修改即可完成所需操作。使用打开文件进行写入,如果文件不存在,则创建文件,并且不截断文件

$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);
以下内容的完整描述:

打开文件进行写入。如果文件不存在,则创建该文件。如果它存在,它既不会被截断(与“w”相反),也不会调用此函数失败(与“x”的情况相同)。文件指针位于文件的开头。如果需要在尝试修改文件之前获得建议锁(请参阅),这可能很有用,因为使用“w”可以在获得锁之前截断文件(如果需要截断,则可以在请求锁后使用ftruncate()


看起来你并不需要它,但是如果你想读和写,也有相应的
“c+”
模式。

为什么不使用数据库呢?从另一个项目接管了项目,已经在处理文件了。可以将其重新编码以使用数据库,但在重新编写之前,请尝试查看是否有其他解决方案。