PHP POST并执行大文件上传

时间:2011-12-06 02:08:51

标签: php file upload

我有以下PHP文件:

  • fileUploadForm.php
  • handleUpload.php

fileUploadForm包含以下输出:

  • 输出$ _SESSION ['errorMessage'](如果有的话)
  • 输出发布到handleUpload.php的文件上传表单

handleUpload.php执行以下操作:

  • 验证会话(如果验证失败,则重定向到登录)
  • 验证文件(如果验证失败,则设置$ _SESSION ['errorMessage'])
  • 扫描病毒档案
  • MoveFile
  • 更新数据库

脚本在大文件上传时遇到问题。为了测试目的,我已将有关文件上传的所有php.ini设置设置为非常大。所以我不相信这个问题是配置问题。

以下行为让我感到困惑:

  • 当我看到文件在tmp中增长时,文件上传继续远远超过设置的max_input_time。我的理解是,一旦超过max_input_time,脚本将终止,反过来,文件也会上传。有关为何没有发生这种情况的任何想法?

  • 如果我中途停止文件上传并刷新fileUploadForm(不重新提交),脚本将输出与handleUpload中设置的文件验证相关的错误消息。这似乎表明即使文件上传没有完成,handleUpload中的代码行也在执行。 php是否执行脚本并异步接收表单数据?我原以为脚本会等到所有表单数据都被收到后再执行任何代码。但这种假设与我所看到的行为相矛盾。数据POST /脚本执行的顺序是什么?

  • 当max_input_time以及其余的配置值被设置为非常大以进行测试时,将完成非常大的上传。然而,剧本的其余部分似乎已经死亡。即病毒扫描和文件移动永远不会发生,数据库也不会更新。我为脚本中的每个操作设置了错误处理,但没有抛出任何错误。这个页面似乎已经死了。关于为什么会发生这种情况/如何发现这种错误的任何想法?

提前致谢。 凯特

1 个答案:

答案 0 :(得分:0)

第二个问题的引用(至少部分地)回答了另外两个问题:

I would have thought that the script would wait until all form data was received before executing any code.

为了使PHP能够处理所有输入数据,Apache(或您正在使用的任何HTTP服务器)将首先等待文件上载完成,然后才会处理PHP脚本。因此,PHP的max_input_time检查将在文件上载过程完成后发挥作用。

现在,在这种情况下,你可能会问为什么你的病毒扫描,文件移动和任何其他脚本程序都没有发生,因为任何与PHP相关的计时器应该从脚本的执行开始是合乎逻辑的,这应该是在收到所有输入数据后发生。嗯,应该是这样的,说实话 - 我对此的看法是一种黑暗中的镜头,但是......要么超出一些其他限制,要么脚本是根据请求启动的,但是被暂停httpd直到准备继续并有效地进行 - 其中一些计数器可能会在此期间过期。

我不知道如何回答您的第二个问题,因为刷新意味着所有数据都会重新发布并应重新处理。我怀疑你是否会做另一件事 - 只需加载handleUpload.php而无需重新提交表单,但我有可能提到。如果第一个请求意外终止,那么可能会有一个猜测 - 第二次发生了一些垃圾收集和/或恢复过程。

希望能稍微清理一下。