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


Downloading latest files from remote server without downloading previous files

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

该脚本作为cron作业运行,每天从一组服务器中获取新文件数次。通常,文件的数量很少,因此很容易下载所有内容,对内容进行散列,并将结果与数据库中存在的内容进行比较,以确定文件是否是新的。

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

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

我考虑的另一个解决方案是将文件名和时间戳作为组合键,并将这两个属性与文件表中的条目进行比较。我不确定这是否是一个有效或安全的想法。文件名是非常独特的,所以这可能会起作用。我真的在寻找最安全的方法来避免丢失文件。

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

我没有ssh访问权限,所以远程校验和是不可能的。

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

谢谢

你自己回答了你的问题。

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

不改变文件的时间戳或大小,而改变文件的内容是极不可能的。


当然,除了计算文件校验和。但是phpseclib不支持这个。大多数SFTP服务器(特别是OpenSSH)也不这样做。
参见如何在SFTP文件传输期间执行校验和以确保数据完整性?