【问题标题】:How can I prevent large Apache/PHP file uploads from failing?如何防止大型 Apache/PHP 文件上传失败?
【发布时间】:2012-07-06 11:15:23
【问题描述】:

我最近在我们的一台服务器上安装了一个 PHP 下载门户。一切正常,但用户无法上传大文件(~ 20 MB)。

我将以下设置设置为极大值或无限制:

memory_limit
upload_max_filesize
post_max_size
memory_limit

完整的php.ini这里:http://pastebin.com/NrqJvMVM

但是重启服务器后还是失败了。

我是否缺少设置?我是否必须更新 Apache 配置中的任何值?公司防火墙会以某种方式干扰吗?

编辑:我检查了 phpinfo() 并且主配置仍然显示旧值。但是,配置文件 C:\Windows\php.ini 具有新值。我是否使用了错误的配置文件。

【问题讨论】:

    标签: php apache memory-management file-upload large-files


    【解决方案1】:

    您也可以在脚本中测试参数。也许这会有所帮助:

    1. max_execution_time = ini_set("max_execution_time", "-1");
    2. post_max_size = ini_set("post_max_size", "200M");
    3. memory_limit = ini_set("memory_limit", "200M");
    4. upload_max_filesize = ini_set("upload_max_filesize", "200M");

    在 .htaccess 中:

    php_value upload_max_filesize 200M

    php_value memory_limit 256M

    php_value max_execution_time 18000

    这里有关于这个主题的好文章:http://www.cyberciti.biz/faq/linux-unix-apache-increase-php-upload-limit/ | https://www.dokuwiki.org/faq:uploadsize

    Suhosin 安装在你的服务器上还是你使用 fcgi ;-)?

    【讨论】:

    • 我不使用 Suhoshin 或 fcgi。我尝试将值添加到 .htaccess,但文件上传仍然无法正常工作。我现在没有收到错误消息,但该文件从未出现在服务器上。
    • 我编辑了这个问题,也许其他信息会对你有所帮助。
    • 它正在工作。由于某种原因,php 无法读取 windows 目录中的配置文件。
    【解决方案2】:

    您安装的所有配置设置都包含在 php.ini 文件中。有时这些设置可能会被 apache .htaccess 文件 中的指令覆盖,甚至被脚本本身覆盖。

    以下我们需要修改的设置 -

    • file_uploads
    • upload_max_filesize
    • max_input_time
    • memory_limit
    • max_execution_time
    • post_max_size

    详细的配置设置如下。

    • upload_max_filesize 和 post_max_size

      文件通常以一种称为“multipart/form-data”的格式发布到网络服务器。 post_max_size 设置脚本以这种方式可以接受的数据量的上限。理想情况下,该值应大于您为 upload_max_filesize 设置的值。

      重要的是要意识到upload_max_filesize 是您要上传的所有文件大小的总和。 post_max_size 是 upload_max_filesize 加上表单中所有其他字段的长度加上编码器可能包含的任何 mime 标头的总和。由于这些字段通常很小,您通常可以将上传的最大大小近似为帖子的最大大小。

      根据 PHP 文档,您可以在 HTML 表单中设置 MAX_UPLOAD_LIMIT 以建议对浏览器的限制。

    • 内存限制

      当 PHP 引擎处理传入的 POST 时,它需要将一些传入的数据保存在内存中。仅当您在配置时使用了 --enable-memory-limit 选项时,此指令才有效。设置过高的值可能会非常危险,因为如果同时处理多个上传,所有可用内存都将被用完,并且其他消耗大量内存的不相关脚本也可能影响整个服务器。

    • max_execution_time 和 max_input_time

      这些设置定义了脚本的最长生命周期以及脚本在接受输入时应该花费的时间。如果正在传输几兆字节的数据,则 max_input_time 应该相当高。您可以通过在脚本中调用 set_time_limit() 函数来覆盖 ini 文件中 max_input_time 的设置。

    附加评论

    • Apache 设置

      apache 网络服务器有一个 LimitRequestBody 配置指令,它限制所有 POST 数据的大小,而不管使用的 Web 脚本语言如何。某些 RPM 安装将限制请求正文设置为 512Kb。您需要将其更改为更大的值或完全删除该条目。

    • 其他选项

      如果您希望在您的网站上处理大量并发文件传输,请考虑使用 perl 或 java 服务器端组件。 PHP 恰好也是我们最喜欢的 Web 编程语言,但 perl 和 Java 在文件上传方面略领先。

    另见:

    1. Upload large File upto 100MB using php
    2. upload large files using php, apache
    3. PHP: Uploading large files fail

    【讨论】:

    • 感谢您富有洞察力的回答,我希望它得到应有的支持。不幸的是,几天前我已经解决了这个问题,并接受了一个帮助我解决问题的答案。
    • 没有问题。我已经给出了彻底的答案,因为当前的答案没有提供太多信息。
    【解决方案3】:

    也许,this 文章可以帮助你。您可以将参数添加到 .htaccess

    【讨论】:

    • 谢谢,但我相信我已经设置好了所有这些设置。
    • 当我处理大量上传时,我发现这个小程序jumploader.com 也可以使用php。也许这对您的项目有好处。
    【解决方案4】:

    你已经写了两次 post_max_size 变量,其中第一个的值为 0,第二个的值为 9999M,删除第一个并尝试。

    【讨论】:

    • 试过了,没用。
    • 你为什么把这些变量的值增加这么多,根据你的需要设置就行了,不多说了。
    • 唯一真正巨大的值是文件上传大小 (9999 MB)。我需要无限的上传大小,但 9999 MB 就足够了。
    • 请问您允许用户上传什么。
    • 它被亲密客户用来上传无法通过电子邮件传输的文件,因为它们要么太大,要么因为安全服务阻止了它(例如,某些公司不允许您发送可执行文件)
    【解决方案5】:

    我是否使用了错误的配置文件。

    嗯,phpinfo() 告诉你你正在使用哪一个。查看输出顶部附近的Configuration File (php.ini) PathLoaded Configuration Fileright。

    【讨论】:

      【解决方案6】:

      也许 MAX_FILE_SIZE 没有正确设置...

      <form enctype="multipart/form-data" action="index.php" method="post">
      <input type="hidden" name="MAX_FILE_SIZE" value="50000" />
      <input name="filedata" type="file" />
      <input type="submit" value="Send file" />
      </form>
      

      【讨论】:

      • 下载入口一直在其他服务器上工作,所以我认为问题不是代码本身造成的。
      【解决方案7】:

      你应该找到正确的 php.ini 文件 =)

      【讨论】:

        【解决方案8】:

        我过去遇到过你的情况,我发现最好的解决方案是使用第三方库在客户端将文件拆分成块,然后将它们全部重新放在服务器上。 我发现了这个:http://www.plupload.com/

        非常方便和有效。它适用于各种不同的技术,因此它可以在绝大多数客户端机器上工作。 (flash, silverlight, html5 file api aso...) 干杯!

        【讨论】:

        猜你喜欢
        • 2011-05-04
        • 1970-01-01
        • 2012-04-12
        • 2022-11-22
        • 2019-09-20
        • 2012-05-31
        • 2012-07-24
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多