PHP处理FTP丢弃目录中的文件

时间:2012-02-08 11:50:37

标签: php ftp

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

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

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

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

如果FTP文件上传成功完成,有没有一种方法可以检查PHP?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

还有另一种选择,这些方法中的任何一种都不合适,可能是使用诸如drftpd之类的FTP服务器,它允许使用它的“zipscript”插件建议的日志记录,对.sfv文件执行文件的校验和。但是,这需要大量配置,可能不适合,具体取决于您的设置。

祝你好运。

答案 1 :(得分:1)

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

ProFTPD,例如拨打此HiddenStoreshttp://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html

答案 2 :(得分:0)

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

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

在PHP中创建FTP服务也是可能的,但可能还有很多工作......但是,学习和配置已经编程,测试和体验过的FTP服务器几乎肯定更容易。