【问题标题】:How to tell if a file has finished uploading in PHP?如何判断文件是否已在 PHP 中完成上传?
【发布时间】:2017-08-14 07:20:54
【问题描述】:

我有一个压缩图像的 cron 脚本。它基本上遍历文件夹,然后压缩文件夹中的文件。我的问题是一些图像正在中途处理。我的理论是用户正在上传图像,并且在图像完成上传文件之前,压缩器会尝试压缩文件。从而压缩了一半上传的图像,并导致显示一半的图像。

  1. PHP 中是否有方法可以确认文件已完成上传?这样我就只能在知道文件已完全写入后才能进行压缩?
  2. 或者,有没有办法检查一个文件是否正在被另一个进程使用?
  3. 或者,当文件“写入磁盘”并在 10 分钟过去后才处理它是否足够可靠?

【问题讨论】:

标签: php


【解决方案1】:

在文件完全上传之前,PHP 不会触发您的操作,但您的 cron 作业可以在文件完全保存之前开始与文件交互。

$_FILES 保存某些内容时,将其保存到带有. 前缀的版本以将其标记为不完整。确保您的 cron 作业跳过任何此类文件。

然后,一旦保存操作完成,重命名不带 . 前缀的文件,使其符合处理条件。

【讨论】:

  • 我知道机会可能很小,但是如果文件没有完成“移动”,是否会发生同样的情况?
  • @coderama 重命名文件是一个即时操作,要么未完成,要么已完成。复制文件需要大量时间,在此期间它在目录列表中但不完整,导致您遇到问题。
【解决方案2】:

有两种方法来处理场景

标志

在修改/写入文件之前设置该文件的标志。 我们的应用程序处理大量文件,我们在处理它们之前设置标志,一旦完成我们删除标志,因为它在 cron 上运行标志是处理文件的最佳方式。

通常,您可以在每个文件的表格上增加一列。或者你可以有一个数组来存储所有当前正在处理的文件。

filemtime()

正如您所提到的,您可以检查文件mtime 是否超过当前时间 10 分钟,然后您压缩它们,但如果其他一些进程正在使用同时打开的文件。它再次导致问题。

所以最好用flag。如果其他进程从不经常修改文件。

【讨论】:

    【解决方案3】:

    您可以使用flock 来确保文件未在使用中,例如参见here。或者,您可以检查图像是否损坏或损坏,请参阅here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多