我有一个函数,它接收文件名和 json 对象以写入文本文件。
该对象已更新,需要完全替换文件的当前内容。每个站点访问者都有自己的文件。多次快速更改会造成文件被截断的情况fopen(file,w+)
,然后不会被写入,因为它已被锁定。最终结果是空文件。
我确信有一个标准的简单方法可以做到这一点,因为这是一项常见的活动。理想情况下,我正在寻找一种在截断文件之前检查文件是否有锁的方法fopen
in 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 来自PHP手册只需稍作修改即可完成您想要的操作。使用"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+"
如果您想同时读取和写入,请使用模式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)