如果原件不会被截断,是否有必要写入备份文件?

时间:2012-01-05 10:31:41

标签: php database

所以我有以下功能:

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()正在写入临时位置的文件,写入该文件并替换原始文件,即使我没有截断该文件?

数据丢失的可能性有多大?

1 个答案:

答案 0 :(得分:3)

我会说这个简短的回答是“不”。

使用当前方法,您在修改文件数据之前获取独占锁。这意味着当您拥有此锁定时(在咨询锁定的规定范围内),没有其他进程可以修改该文件。值得注意的一点是,您不测试fwrite()是否成功,如果您担心数据丢失,您可能应该这样做。

如果您复制文件并写入复制的文件,则有两个问题:

  • 此过程需要更长时间,尤其是在文件非常大的情况下。
  • 您不再对原始文件进行独占锁定,因此如果其他人在您执行此操作时尝试修改该文件,则可能会在复制文件时覆盖其修改。

如果您确实想在复制操作之前备份文件,那么您应该这样做 - 进行备份。但是你仍然修改原始文件,而不是副本。如果失败,请将原件替换为备份,以便原件实际上不会被修改。

在我看来,所有这些都是不必要的 - 在每次写入操作之前创建备份非常悲观,并且会导致整体系统效率低得多,特别是因为您在对文件执行任何操作之前获取了对文件的独占锁定。但你肯定应该做的是测试fwrite()电话的结果。