FOPEN(文件,W +)截断该文件之前,我可以检查它是否与羊群锁定()(fopen(fil

2019-07-02 10:33发布

我有收到一个文件名和一个JSON对象写入一个文本文件中的函数。

该对象被更新,需要完全替换文件的当前内容。 每个网站访问者都有自己的文件。 多的快速变化创造一个文件被截断的情况下fopen(file,w+)则不会被写入,因为它是锁着的。 最终的结果是空文件。

我敢肯定有一个标准的根本办法做到这一点,因为它是这样一个平常的活动。 理想的情况是什么,我要的是来检查文件是否已截断与文件之前锁定的方式fopenw+模式或方式来切换模式。

这似乎很奇怪,你将不得不截断与文件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;
    }
}

Answer 1:

实例#1从PHP手册会做你想要有轻微的修改内容。 使用"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”可以截断该文件获得锁定之前,(如果截断需要,ftruncate()即可使用的请求锁之后)。

它看起来并不像你需要它,但也有一个相应的"c+"模式下,如果你想读取和写入。



文章来源: fopen(file,w+) truncates the file before I can check if it's locked with flock()
标签: php fopen flock