我正在尝试通过SFTP下载上传到服务器的最新文件。下载后,文件信息存储在表中,信息包括md5校验和,时间戳,文件名等。
该脚本作为cron作业运行,每天唤醒几次以从一组服务器中获取新文件。通常,文件的数量很少,因此很容易下载所有内容,散列内容,并将结果与数据库中存在的内容进行比较,以确定文件是否为新文件。
但是,我们现在要访问的服务器不会清除任何内容。因此,下载和散列所有内容的成本太高。似乎唯一的选择是远程评估文件的元数据并使用它来确定文件是否是新的。
我认为可能有用的一个解决方案是使用远程文件的mtime或ctime与文件表中存储的最新时间戳进行比较。然后,该脚本将仅下载mtime或ctime大于最新记录时间戳的文件(源自上次下载)。但是,mtime和ctime不是指上传时间。因此,更糟糕的情况是,文件可以在最后一次cron运行之后上载,其中mtime或ctime小于最近记录的时间戳。
我考虑的另一个解决方案是将文件名和时间戳视为复合键的排序,并将这两个属性与文件表中的条目进行比较。我不确定这是否是一个有效或安全的想法。文件名非常独特,所以也许这样可行。我真的在寻找避免错过文件的最安全的赌注。
实际进行访问的脚本主要使用phpseclib sftp库编写。
我没有ssh访问权限,因此无法进行远程校验和。
非常感谢任何见解。
谢谢
答案 0 :(得分:1)
你自己回答了你的问题。
收集文件名,修改时间和远程文件的大小。将它们存储在数据库中下一次,收集相同的元数据并与之前的运行进行比较。这是你能做的最好的事情。
在不更改文件时间戳或大小的情况下,文件内容发生变化的可能性极小。
当然除了计算文件校验和。但是phpseclib不支持这一点。大多数SFTP服务器(特别是OpenSSH)也没有 见How to perform checksums during a SFTP file transfer for data integrity?