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

Php 如果原始文件不会被截断,是否有必要写入备份文件?,php,database,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();

所以我有以下功能:

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


数据丢失的可能性是什么?

我想简单地说,答案是“不”

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

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

  • 该过程将花费更长的时间,尤其是当文件非常大时
  • 您不再拥有对原始文件的独占锁定,因此,如果其他人在您执行此操作时试图修改该文件,您可能会在将该文件复制回时覆盖他们的修改
如果您确实想在复制操作之前备份文件,那么您应该做的就是备份。但是您仍然修改原始文件,而不是副本。如果失败,用备份替换原始文件,这样原始文件就不会被修改


实际上,在我看来,所有这些都是不必要的—在每次写操作之前创建备份是非常悲观的,并且会导致整个系统的效率大大降低,特别是因为在对文件执行任何操作之前,您正在获取文件的排他锁。但是你肯定应该做的是测试你的
fwrite()
调用的结果。

谢谢Dave,我应该提到这是一个数据库系统,你一针见血地解释了为什么出于速度原因我不想写备份。我喜欢创建一个副本,然后测试
fwrite()
是否成功,如果
fwrite()
失败,则用副本替换原始副本。我怀疑它可能是一个数据库-这是此类事情的常见原因。应该注意的是,与外部数据库相比,纯PHP数据库往往效率极低-您应该看看,几乎每个PHP5安装都提供了这种数据库。在我的数据库中不是这样的:P就速度而言,目前至少就我使用的大小而言,数据库是相当有效的。不会超过几千张唱片。