【问题标题】:PHP file upload affected or not by max_input_time?PHP文件上传是否受max_input_time影响?
【发布时间】:2012-07-08 22:06:23
【问题描述】:

我正在研究在 PHP 中设置默认值的最佳值是什么。我看到很多关于max_input_time 的矛盾点。

这个答案说他认为文件上传不计入计时器: https://stackoverflow.com/a/3758522/518169

在官方 PHP 文档中,有一个巨大的红色警告说:

max_input_time 设置最大时间,以秒为单位,脚本为 允许接收输入;这包括文件上传。对于大型或 多个文件,或连接较慢的用户,默认为 60 可能超过秒数

来源:http://php.net/manual/en/features.file-upload.common-pitfalls.php,最后更新时间:2012 年 7 月 6 日,星期五

因此看来max_input_time 确实会影响文件上传,并确保访问者即使通过慢速或移动连接也可以上传 20 MB 的文件,默认值 60 绝对不是足够的!

您建议将此值设置为什么? 300?

另外,max_execution_timemax_input_time 之间有什么关系吗?例如,max_execution_time 需要大于max_input_time

【问题讨论】:

  • 我在上传大文件和 Apache 超时时遇到了一些问题,但 PHP 没有。
  • 有趣的是,我的一个托管服务提供商在很长一段时间内都遇到了同样的问题,尽管 PHP 配置中的所有内容似乎都是在较慢的连接上合法的大型上传导致 HTTP/1.1 500 Internal Server Error。现在我在第一个答案中看到了这句话,我开始想知道真正的交易是什么。将密切关注此线程并尝试自己挖掘一些东西。

标签: php


【解决方案1】:

经过一些快速的基准测试我认为max_input_time 对处理连接速度较慢的用户的大量上传没有任何影响。

来自http://us3.php.net/manual/en/info.configuration.php#ini.max-input-time

这设置允许脚本解析输入数据(如 POST 和 GET)的最长时间(以秒为单位)。 从接收到服务器上所有数据的那一刻到开始执行脚本。

我使用的是 PHP 5.3.8 并使用了以下 .htaccess 配置

php_value max_input_time 5
php_value max_execution_time 1
php_value upload_max_filesize "2048M"
php_value post_max_size "2048M"

我的测试脚本是:

<?php
if (!empty($_FILES)) {
    echo '<pre>';
    var_dump($_FILES);
    echo '</pre>';
}
?>
<form enctype="multipart/form-data" method="POST">
    File: <input name="userfile" type="file" />
    <input type="submit" value="Upload" />
</form>

经过多次试验,我的 1.5G 文件大约需要 16-17 秒上传4-5 秒处理,执行时间基本上为 0。

使用max_input_time 5,脚本完成。将其设置为 4,我们得到 PHP Fatal error: Maximum execution time of 4 seconds exceeded in Unknown on line 0, referer: http://localhost/test-upload.php

似乎max_execution_time 也没有任何意义,因为我们在整个测试过程中都将它保持在 1。

【讨论】:

  • 正是我想要的。谢谢!
  • 只想说,这个答案不正确。在极少数情况下,慢速连接会给您带来 Broken pipe 错误。我今天刚刚修好了,就是把max_input_time设置为600。我现在正在google如何计算max_input_time,但只看到错误的答案。
  • @BenP.P.Tung,这很重要。请添加更多详细信息。
  • 这个答案完全不正确。也许它在 PHP 5.4 中被改变了?无论如何,如果上传文件的时间超过 max_input_time,我可以 100% 确认 max_input_time 将导致 500 错误。我调试了这个问题几个小时,最后改变了这个值,它被修复了。在 PHP 5.4.16 和 IIS 7.5 上测试。不仅如此,PHP 手册现在还声明“这设置了允许脚本解析输入数据(如 POST 和 GET)的最长时间(以秒为单位)。计时开始于 在服务器上调用 PHP 的那一刻并在执行开始时结束”,其中包括上传时间。 goo.gl/FTfsD3
  • 我会补充一点,错误日志都说由于某种原因已经达到 max_execution time 而不是 max_input_time,即使我将 max_execution_time 设置为 10000。
【解决方案2】:

我对 max_input_time 进行了广泛的研究。网络传输时间不是一个因素。 PHP 作为 Apache 处理程序 (mod_php) 或 Nginx/PHP-FPM -pair 产生了类似的结果:一旦传输完成,PHP 就会获取上传的文件,并且 Web 服务器会移交数据。在我的测试中,2 秒 max_input_time 足以处理 800 MiB 的上传。

所有详情都在http://blog.hqcodeshop.fi/archives/185-PHP-large-file-uploads.html

【讨论】:

    【解决方案3】:

    这将取决于 PHP 如何桥接到网络服务器。

    从技术上讲,网络服务器有可能在收到请求标头后立即调用 PHP - 在这种情况下,PHP 将不停地等待 POST 数据通过互联网,直到它可以填充请求变量(很有可能会超过 max_input_time)。但更常见的是,网络服务器会延迟 PHP 的调用,直到它收到完整的请求(超出 max_input_time 的可能性要小得多)。

    【讨论】:

    • 愿意提供有关此主题的任何进一步阅读吗?这是我第一次发现 PHP 处理在请求开始时被调用,从而影响了max_input_time。谢谢。
    • @symcbean,哪个实现可以做到这一点?听起来这不是对应用程序分层的好方法,因为 PHP 脚本现在需要处理诸如连接中途中断等问题。
    • 我可以确认这确实发生了。我在上传超过 60 秒的大文件时收到 500 错误。我只更改了 max_input_time 并修复了它。不仅如此,php 手册现在的措辞与上面引用的不同。它现在说计时开始“在服务器调用 PHP 的那一刻”,而不是“从接收服务器上的所有数据的那一刻开始”。你可以在这里阅读:goo.gl/FTfsD3。奇怪的是 PHP 日志中的错误表示已达到 max_execution_time,即使我将其设置为 10000。
    【解决方案4】:

    从 PHP 5.4 开始,PHP 文件上传肯定会受到 max_input_time 的影响。我最近在上传时间超过 60 秒的文件上收到 500 错误。我在我的 php.ini 中更改了这个单一值,它消失了。

    此外,手册中的措辞现在与接受的答案中引用的不同。它现在说:

    这设置允许脚本解析输入数据(如 POST 和 GET)的最长时间(以秒为单位)。计时从在服务器调用 PHP 的那一刻开始到执行开始时结束。

    我使用的是 PHP 5.4.16 nts 和 IIS 7.5。显然,在文件上传之前调用了 PHP。

    需要注意的一件有趣的事情是我的 PHP 错误日志给出了错误的错误。他们说“PHP致命错误:超过10000秒的最大执行时间......”。我将 max_execution_time 设置为什么并不重要,它会在使用新数字时给出相同的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多