【问题标题】:Downloading latest files from remote server without downloading previous files从远程服务器下载最新文件而不下载以前的文件
【发布时间】:2015-05-28 15:06:20
【问题描述】:

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

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

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

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

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

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

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

任何见解将不胜感激。

谢谢

【问题讨论】:

  • 我猜你也可以做文件大小。您是在询问如何使用 phpseclib 获取该信息,或者是否以这种方式利用该信息是个好主意?

标签: php sftp phpseclib


【解决方案1】:

你自己回答了你的问题。

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

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


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

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 2016-05-24
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多