从远程服务器下载最新文件而不下载以前的文件

Downloading latest files from remote server without downloading previous files

我正在尝试下载通过 SFTP 上传到服务器的最新文件。下载后文件信息存储在table中,信息包括md5校验和、时间戳、文件名等

脚本 运行 作为 cron 作业,每天唤醒几次以从一组服务器获取新文件。通常,文件的数量很少,所以很容易只下载所有内容,对内容进行哈希处理,并将结果与​​数据库中现有的内容进行比较,以确定文件是否是新文件。

但是,我们现在访问的服务器不会清除任何内容。因此,下载和散列所有内容的成本太高了。似乎唯一的选择是远程评估文件的元数据并使用它来确定文件是否是新的。

我认为可能有效的一个解决方案是使用远程文件的 mtime 或 ctime 与文件 table 中存储的最新时间戳进行比较。然后脚本将只下载 mtime 或 ctime 大于最新记录的时间戳(来自上次下载)的文件。但是,mtime 和ctime 不是指上传时间。因此,更糟糕的情况是,在最后一个 cron 运行 之后上传的文件的 mtime 或 ctime 小于最近记录的时间戳。

我考虑过的另一种解决方案是将文件名和时间戳视为一种复合键,并将这两个属性与文件 table 中的条目进行比较。我不确定这是否是一个有效或安全的想法。文件名非常独特,所以也许这行得通。我真的在寻找避免丢失文件的最安全方法。

实际执行访问的脚本主要是使用 phpseclib sftp 库编写的。

我没有 ssh 访问权限,因此无法进行远程校验和。

如有任何见解,我们将不胜感激。

谢谢

你自己回答了你的问题。

收集远程文件的文件名、修改时间和大小。将它们存储在数据库中。下一次,收集相同的元数据并与之前的 运行 进行比较。这是你能做的最好的事情。

在不更改文件时间戳或大小的情况下更改文件内容的可能性很小。


当然,计算文件校验和除外。但是 phpseclib 不支持那个。大多数 SFTP 服务器(尤其是 OpenSSH)也不支持。
参见 How to perform checksums during a SFTP file transfer for data integrity?