【问题标题】:PHP Processing Files in an FTP Drop DirectoryPHP 处理 FTP 放置目录中的文件
【发布时间】:2012-02-08 11:50:37
【问题描述】:

我想在服务器上创建一个 FTP drop,文件可以通过 FTP 上传到某些目录,然后由 PHP 脚本处理(作为 cron 作业或守护程序运行)。

FTP文件或从目录中读取文件都没有问题。但是 PHP 脚本如何知道文件上传是否已完成或仍在进行中?

我可以反复检查文件大小是否在一段时间内发生了变化,如果 1 分钟内没有变化,则处理文件。但这似乎不是一个优雅的解决方案,我想它有时可能会出错,例如上传暂停或由于某种原因失败。

另一种方法是在每个文件之后上传一个空白文本文件,名称有所不同(例如competed.filename)。然后脚本可以检查这些文件的存在并处理相应的文件。但这也不是一个优雅的解决方案,并且可能容易在某个地方出错。

如果 FTP 文件上传成功完成,有没有用 PHP 检查的好方法?

【问题讨论】:

  • 您考虑过使用校验和吗?
  • 我没有想到这一点,但现在看来确实很明显。您的意思是计算哈希值,以某种方式与文件一起发送(作为单独的文件?),然后继续检查它直到它相同?或者有更简单的标准方法吗?
  • Alasadair,我不认为使用校验和是解决这个问题的有效方法。如果文件很大,在不断增长的文件上一次又一次地计算校验和会耗费时间。
  • @SusamPal,是的,好的,这也有道理。
  • 有一个类似的问题,我们有一个文本文件,其中包含一些数据和伴随图像的文件名,如何知道伴随文件是否已完成上传以便我们处理它们

标签: php ftp


【解决方案1】:

您可以创建一个脚本来监视接收 FTP 服务器的日志文件。将 tail 固定到日志文件的末尾并等待新文件达到“完成”状态。并非所有服务器都提供这样的日志条目。否则,可以使用内核挂钩来确定文件何时被 WRITE_CLOSED,就像 FTP 服务器完成上传时一样。

我在 Perl 和 Python 中都成功完成了这两种方法,但我对 PHP 不太确定。由于这将是在命令行上运行的脚本,因此如果您可以跟踪 FTP 日志以获取完整条目,我建议您尝试使用 Perl,如果您需要添加内核挂钩,我建议您使用 Python。

Python:http://pyinotify.sourceforge.net/

Perl:http://metacpan.org/pod/File::Tail

还有另一种选择,如果这些方法中的任何一种都不合适,那可能是使用 FTP 服务器,例如 drftpd,它允许按照建议通过使用它的“zipscript”插件进行日志记录,针对 .sfv 文件执行文件校验和.但是,这需要大量配置,并且根据您的设置可能不适合。

祝你好运。

【讨论】:

    【解决方案2】:

    一些 FTP 服务器支持文件在上传时具有特殊后缀的机制。上传完成后,它们将重命名为最终目标文件名。

    ProFTPD 例如称之为HiddenStoreshttp://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html

    【讨论】:

      【解决方案3】:

      如果您想要一个纯 PHP 解决方案,按照您概述的方式检查文件是否有更改是我过去使用的解决方案。

      如果您想立即处理,而不是等待 1 分钟,则需要修改实际的 FTP 服务器。一些 FTP 服务器将允许您将它们配置为在上传时执行操作 - 该操作可能是调用您的 PHP 脚本以及文件名。

      用 PHP 创建一个 FTP 服务也是可能的,但可能需要做更多的工作......但几乎可以肯定,学习和配置一个已经编程、测试和经验丰富的 FTP 服务器更容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-22
        • 1970-01-01
        • 2015-03-29
        • 2013-01-30
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多