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