fopen(file,w +)截断文件,然后我可以检查它是否被flock()锁定

Pet*_*ter 4 php fopen flock

我有一个函数,它接收一个文件名和一个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)

Joh*_*ica 8

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+"如果你想要读写它们,还有一个相应的模式.