如何确定文件是否仍在通过 ftp 传输
我有一个目录,其中包含需要使用PHP批量处理的文件。文件通过 FTP 复制到服务器上。有些文件非常大,需要很长时间才能复制。如何在PHP中确定文件是否仍在传输(因此我可以跳过对该文件的处理并在下次运行的批处理中处理它)?
一种可能性是获取文件大小,等待片刻,然后验证文件大小是否不同。这不是防水的,因为转移有轻微的机会只是停滞了一会儿......
我有一个目录,其中包含需要使用PHP批量处理的文件。文件通过 FTP 复制到服务器上。有些文件非常大,需要很长时间才能复制。如何在PHP中确定文件是否仍在传输(因此我可以跳过对该文件的处理并在下次运行的批处理中处理它)?
一种可能性是获取文件大小,等待片刻,然后验证文件大小是否不同。这不是防水的,因为转移有轻微的机会只是停滞了一会儿......
执行此操作的最安全方法之一是使用临时名称上传文件,并在传输完成后重命名它们。您的程序应跳过具有临时名称的文件(简单的扩展名工作正常。显然,这需要客户端(上传者)合作,因此并不理想。
[如果需要,这也允许您在给定时间段后删除失败(部分)传输。
任何基于轮询文件大小的内容都是不雅和不安全的。
另一种方案(也需要上传者的合作)可能涉及首先上传文件的哈希和大小,然后上传实际文件。这使您可以了解传输何时完成以及传输是否一致。(围绕这个想法有很多变体。
不需要客户端合作的东西是检查文件是否被另一个进程打开(你如何做到这一点取决于操作系统 - 我不知道有PHP内置的东西可以做到这一点。 和/或可以在各种Unix类型平台上使用,Windows为此提供了API。如果另一个进程打开了该文件,则可能是它尚未完成。lsof
fuser
请注意,如果您允许重新启动/恢复上载,或者如果您的FTP服务器软件在整个传输过程中不保持文件打开状态,那么最后一种方法可能不是万无一失的,因此YMMV。
我们的服务器管理员建议使用ftpwho,它输出当前传输的文件。
http://www.castaglia.org/proftpd/doc/ftpwho.html
因此,解决方案是解析ftpwho的输出,以查看目录中的文件是否正在传输。