所以我有以下功能:
public function append(array $data) {
$this->connect('ab');
if(flock($this->_pointer, LOCK_EX)) {
fwrite($this->_pointer, $this->cleanInput($data));
$this->unlock();
$this->disconnect();
return true;
} else {
$this->disconnect();
return false;
}
}
它将一个字符串写入文件的末尾。打开文件进行写入但不截断,指针直接放在文件的末尾。
我的问题是,是否有必要copy()
正在写入临时位置的文件,写入该文件并替换原始文件,即使我没有截断该文件?
数据丢失的可能性有多大?
答案 0 :(得分:3)
我会说这个简短的回答是“不”。
使用当前方法,您在修改文件数据之前获取独占锁。这意味着当您拥有此锁定时(在咨询锁定的规定范围内),没有其他进程可以修改该文件。值得注意的一点是,您不测试fwrite()
是否成功,如果您担心数据丢失,您可能应该这样做。
如果您复制文件并写入复制的文件,则有两个问题:
如果您确实想在复制操作之前备份文件,那么您应该这样做 - 进行备份。但是你仍然修改原始文件,而不是副本。如果失败,请将原件替换为备份,以便原件实际上不会被修改。
在我看来,所有这些都是不必要的 - 在每次写入操作之前创建备份非常悲观,并且会导致整体系统效率低得多,特别是因为您在对文件执行任何操作之前获取了对文件的独占锁定。但你肯定应该做的是测试fwrite()
电话的结果。