4

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

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

我确信有一种标准的简单方法可以做到这一点,因为这是一种常见的活动。理想情况下,我正在寻找一种在使用fopeninw+模式截断文件之前检查文件是否有锁的方法或切换模式的方法。

您必须截断文件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;
    }
}
4

1 回答 1

10

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);

"c"模式的完整描述:

打开文件进行写入。如果文件不存在,则创建它。如果它存在,它既不会被截断(与“w”相反),对该函数的调用也不会失败(就像“x”一样)。文件指针位于文件的开头。如果希望在尝试修改文件之前获得建议锁(请参阅 参考资料),这可能很有用flock(),因为使用 'w' 可以在获得锁之前截断文件(如果需要截断,可以在请求锁定)。

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

于 2012-10-23T21:03:01.677 回答