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

时间:2012-10-23 20:54:06

标签: php fopen flock

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

1 个答案:

答案 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+"模式。