问题描述
我有一个函数,该函数接收文件名和json对象以写入文本文件.
I have a function which receives a filename and a json object to write to a text file.
对象已更新,需要完全替换文件的当前内容.每个站点访问者都有自己的文件.多次快速更改会导致以下情况:文件被fopen(file,w+)
截断,然后由于被锁定而未被写入.最终结果是空文件.
The object is updated and needs to entirely replace the current contents of the file. Each site visitor has their own file. Multiple rapid changes create a situation where the file is truncated by fopen(file,w+)
, then not written to as it's locked. End result is empty file.
我敢肯定有一种简单的标准方法可以做到这一点,因为它是一种通常的活动.理想情况下,我正在寻找的是一种在w+
模式下用fopen
截断文件之前检查文件是否具有锁定的方法,或者是一种切换模式的方法.
I'm sure there's a standard simply way to do this as it's such a usual activity. Ideally what I'm looking for is a way to check if a file has a lock before truncating the file with fopen
in w+
mode or a way to switch modes.
您似乎不得不用fopen()
截断文件以使文件句柄传递给flock()
来检查它是否被锁定,这似乎很奇怪-但您只是将其截断了,所以有什么用呢?
It seems strange that you would have to truncate the file with fopen()
to get a file handle to pass to flock()
to check if it's locked -- but you just truncated it, so what's the point?
这是我到目前为止拥有的功能:
Here's the function I have so far:
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;
}
}
推荐答案
PHP手册只需稍作修改即可完成您想要的操作.使用 "c"
模式打开文件进行创建如果它不存在,也不要截断它.
Example #1 from the PHP manual will do what you want with a slight modification. Use the "c"
mode to open the file for writing, create it if it doesn't exist, and don't truncate it.
$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"
模式的完整说明:
Full description of the "c"
mode:
它看起来好像不是您需要的,但是如果您想同时读写,还可以使用相应的"c+"
模式.
It doesn't look like you need it, but there's also a corresponding "c+"
mode if you want to both read and write.
这篇关于fopen(file,w +)在我可以检查文件是否被flock()锁定之前将其截断的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!