【问题标题】:PHP POST and execute for large file uploadsPHP POST 并执行大文件上传
【发布时间】:2012-01-13 17:41:20
【问题描述】:

我有以下 PHP 文件:

  • fileUploadForm.php
  • handleUpload.php

fileUploadForm 包含以下输出:

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

handleUpload.php 执行以下操作:

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

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

以下行为让我感到困惑:

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

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

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

提前致谢。 凯特

【问题讨论】:

    标签: php file upload


    【解决方案1】:

    您第二个问题中的这句话回答了(至少部分地)其他两个:

    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 而不重新提交表单,但我应该提到它的可能性。第二个猜测是,如果第一个请求意外终止 - 第二次发生一些垃圾收集和/或恢复过程。

    希望能稍微澄清一下。

    【讨论】:

    • 我只是在刷新 fileUploadForm.php,实际上并没有重新提交它。但它现在包含在 handleUpload 中设置的会话信息。所以,一些代码正在执行。并且在整个文件上传到 tmp 之前执行。
    • PHP 文档似乎不一致。它定义了 max_input_time 就像您在答案的第一部分中所做的那样:“允许脚本解析输入数据(如 POST 和 GET)的最长时间(以秒为单位)。它是从接收服务器上的所有数据到开始的那一刻测量的脚本执行”(即在上传完成后开始计数)。但在故障排除部分,它表明如果 max_input_time 不够高,某些文件上传将无法完成。但无论哪种方式,我看到文件上传继续,一些脚本执行发生,然后它失败了。
    • 问题是您所说的“仅刷新”是什么意思 - 您是转到浏览器的地址栏并按 Enter 还是按 F5(或单击 Refresh)?如果第二个是您所做的,那么浏览器会询问您是否要重新提交表单数据,并且除非您确认,否则不允许您继续。如果你做第一件事,那么……只有会话数据存在是完全正常的。
    • @Narf 我不会重新提交表格。我正在加载fileUploadForm,而不是handleFileUpload。存在的会话数据的不寻常之处在于,如果同步处理 php 并且文件上传/POST 尚未完成,则它是在 handleUpload 文件中不应该执行的行中设置的。即,我试图了解脚本失败的原因以及失败的原因(在验证代码之后的某个时间)
    猜你喜欢
    • 2015-07-03
    • 2011-08-18
    • 2012-07-20
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多