我有一个目录,里面有需要用PHP批量处理的文件。文件通过FTP复制到服务器上。有些文件非常大,需要很长时间才能复制。如何在PHP中确定文件是否仍在传输中(这样我就可以跳过对该文件的处理,并在下一次运行批处理时处理它)?
一种可能是获取文件大小,等待片刻,然后验证文件大小是否不同。这不是防水的,因为有很小的可能性只是简单地延迟了几分钟……
发布于 2011-08-30 20:42:16
我们的服务器管理员建议使用ftp名来输出当前正在传输的文件。
http://www.castaglia.org/proftpd/doc/ftpwho.html
因此,解决方案是解析ftpwho的输出,以查看是否正在传输目录中的文件。
发布于 2011-08-30 18:51:48
最安全的方法之一是使用临时名称上载文件,并在传输完成后重命名。你的程序应该跳过带有临时名称的文件(一个简单的扩展名就可以了)。显然,这需要客户端(上传者)的合作,所以这并不理想。
如果需要,这还允许您在给定时间段后删除失败的(部分)传输。
任何基于轮询文件大小的东西都是不安全的。
另一种方案(也需要上传者的合作)可以首先上传文件的散列和大小,然后再上传实际的文件。这使您可以知道传输何时完成,以及传输是否一致。(围绕这个想法有很多变种。)
不需要客户端协作的事情是检查文件是否被另一个进程打开。(如何做到这一点取决于操作系统--我不知道有哪种PHP内置可以做到这一点。lsof和/或fuser可以在各种Unix类型的平台上使用,Windows为此提供了API。)如果另一个进程打开了该文件,则该文件很可能尚未完成。
请注意,如果您允许重新启动/恢复上传,或者如果您的FTP服务器软件在整个传输过程中不保持文件处于打开状态,则最后一种方法可能不是万无一失的,因此YMMV。
发布于 2011-08-30 19:22:09
某些FTP服务器允许在发生特定事件时运行命令。因此,如果您的FTP服务器允许这样做,那么您可以构建一个简单的信令方案,让您的应用程序知道文件或多或少已经成功上载(或多或少是因为您不知道用户是打算完整还是部分上载文件)。信令方案可以像创建"uploaded_file_name.ext.complete“文件一样简单,您将监视扩展名为".complete”的文件的存在。
现在,您可以检查是否可以打开要写入的文件。如果正在上传文件,大多数FTP服务器都不允许您这样做。
Mat提到的另一种方法是使用特定于系统的技术来检查文件是否被其他进程打开。
https://stackoverflow.com/questions/7241978
复制相似问题