如何确定文件是否仍在通过ftp传输

mur*_*rze 26 php ftp

我有一个目录,其中包含需要使用PHP批量处理的文件.文件通过FTP复制到服务器上.有些文件非常大,需要很长时间才能复制.如何在PHP中确定文件是否仍在传输(因此我可以跳过该文件的处理并在下一次批处理过程中处理它)?

可能是获取文件大小,等待片刻,并验证文件大小是否不同.这不是防水的,因为转移只是暂时停顿了一会儿......

Mat*_*Mat 11

最安全的方法之一是使用临时名称上载文件,并在传输完成后重命名它们.你的程序应该跳过带有临时名称的文件(一个简单的扩展工作正常.)显然这需要客户端(上传者)合作,所以它并不理想.

[如果您需要,也可以在给定时间段后删除失败的(部分)转移.]

任何基于轮询文件大小的东西都是活泼且不安全的.

另一种方案(也需要来自上传者的合作)可以涉及首先上传文件的散列和大小,然后是实际文件.这使您可以了解传输何时完成以及是否一致.(这个想法有很多变种.)

不需要客户合作的东西是检查文件是否由另一个进程打开.(你如何做到这一点取决于操作系统 - 我不知道这样做的PHP内置.lsof和/或fuser可以在各种Unix类型平台上使用,Windows有这方面的API.)如果另一个进程有文件打开,可能还没完成.

请注意,如果您允许重新启动/恢复上载,或者如果您的FTP服务器软件在整个传输期间没有保持文件打开,那么最后一种方法可能不是万无一失的,所以YMMV.


mur*_*rze 5

我们的服务器管理员建议使用ftpwho,它输出当前传输的文件.

http://www.castaglia.org/proftpd/doc/ftpwho.html

因此解决方案是解析ftpwho的输出以查看目录中的文件是否正在传输.