2011-12-06 91 views
3

我有以下PHP文件:PHP POST和执行大文件上传

  • fileUploadForm.php
  • handleUpload.php

fileUploadForm包含以下的输出:

  • 输出$ _SESSION ['errorMessage'](如果有的话)
  • Ou tput的一个文件上传表单职位,以handleUpload.php

handleUpload.php执行以下操作:

  • void验证会话(login的重新定位,如果验证失败)
  • void验证文件(设置$ _SESSION [ '的errorMessage']如果验证失败)
  • 为病毒
  • MoveFile
  • 更新数据库
  • 01扫描文件

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

以下行为是混淆了我:

  • 当我看文件tmp中成长,文件上传继续以及过去所设定的max_input_time设置。我的理解是,一旦超过max_input_time,脚本将终止,反过来,文件上传也是如此。任何想法为什么这不会发生?

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

  • 当max_input_time与其余配置值一起被设置为测试的可笑程度很大时,将会完成非常大的上载。然而,脚本的其余部分似乎死了。即病毒扫描和文件移动永远不会发生,数据库更新也不会发生。我为脚本中的每个操作设置了错误处理,但不会引发错误。该页面似乎已经死亡。任何想法为什么这可能发生/如何捕捉这样的错误?

在此先感谢。 凯特

回答

0

这句话从你的第二个问题的答案(至少部分地)其他两个:

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

为了让PHP能够处理所有输入数据,阿帕奇(或任何HTTP服务器你使用)将首先等待文件上传完成,然后才会处理PHP脚本。所以,PHP的max_input_time检查将在文件上传过程完成后开始起作用。

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

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

希望能将它清理一下。

+0

我只刷新fileUploadForm.php,而不是实际重新提交它。但它现在包含在handleUpload中设置的会话信息。所以,一些代码正在执行。并且在整个文件上传到tmp之前执行。 – user480029

+0

PHP文档似乎不一致的如何发生这种情况。它定义了max_input_time,就像在答案的第一部分中所做的那样:“允许脚本解析输入数据的最长时间(以秒为单位),如POST和GET,它是从服务器上的所有数据接收开始到启动脚本执行“(即计数在上传完成后开始)。但在故障排除部分,它表明如果max_input_time不够高,某些文件上传将无法完成。但无论哪种方式,我都会看到文件上传继续,发生一些脚本执行,然后失败。 – user480029

+0

问题在于你的意思是“只刷新” - 你是否进入浏览器的地址栏并按Enter键或者是否按F5(或点击刷新)?如果第二个是你所做的,那么浏览器会问你是否要重新提交表单数据,除非你确认,否则不允许你继续。如果你做的第一件事,那么......只有会话数据存在是很正常的。 – Narf