代码之家  ›  专栏  ›  技术社区  ›  Rudiger

当大文件花费超过一分钟时重置

  •  10
  • Rudiger  · 技术社区  · 6 年前

    我有一个带有php后端的表单中的多部分文件上传。我已经定好了 max_execution_time max_input_time 在php.ini中设置为180,并在文件上载中确认这些值已设置和设置 TimeOut 在阿帕奇有180个。我也准备好了

    RewriteRule .* - [E=noabort:1]
    RewriteRule .* - [E=noconntimeout:1]
    

    当我在快速连接上上传一个250MB的文件时,它工作得很好。当我使用较慢的连接或网络链接调节器来人为地降低速度时,相同的文件会超时,在chrome上也会出现 net::ERR_CONNECTION_RESET 1分钟(5秒)后可靠。我也尝试过其他浏览器,结果相同,只是错误信息不同。

    在任何日志中都没有错误的迹象,我已经试过了 http https .

    什么会导致1分钟后重置上载连接?

    编辑

    我现在还尝试了一个简单的上传表单,它绕过了我正在使用的任何框架,仍然在1分钟内超时。

    我还制作了一个睡眠脚本,在2.5分钟后超时,这很有效,页面加载大约需要2.5分钟,所以我看不出它是如何与浏览器或标题相关的。

    我还使用了一个具有更多ram的服务器来确保它与此无关。我已经在3个不同的服务器上测试了不同的规格,但都来自同一个centos 7的基础。

    我现在也升级到了php 7.2,并再次更新了相关字段,没有任何问题。

    编辑2 这个独立实例的技术堆栈是

    • Apache 2.4.6
    • php 5.6/7.2(两者都试过了),有opcache
    • 用于会话信息和密钥/值存储的Redis 3.2.6(Elasticache)
    • PostgreSQL 10.2(无线电数据系统)

    我的技术堆栈中的其他所有内容都已从该测试区域中删除,以尝试隔离问题。efs在系统上,但在我最孤立的测试中,它只是使用ebs。

    编辑3 以下是chrome网络调试器的一些日志:

    {"params":{"net_error":-101,"os_error":32},"phase":0,"source":    {"id":274043,"type":8},"time":"3332701830","type":69},
    {"params":    {"error_lib":33,"error_reason":101,"file":"../../net/socket/socket_bio_adapter.cc","line":216,"net_error":-101,"ssl_error":1},"phase":0,"source":        {"id":274043,"type":8},"time":"3332701830","type":56},
    {"phase":2,"source":{"id":274038,"type":1},"time":"3332701830","type":159},
    {"phase":1,"source":    {"id":274038,"type":1},"time":"3332701830","type":164},
    {"phase":1,"source":    {"id":274038,"type":1},"time":"3332701830","type":287},
    {"params":    {"error_lib":33,"error_reason":101,"file":"../../net/socket/socket_bio_adapter.cc","line":113,"net_error":-101,"ssl_error":1},"phase":0,"source":    {"id":274043,"type":8},"time":"3332701830","type":55},
    {"params":{"net_error":-101},"phase":2,"source":    {"id":274038,"type":1},"time":"3332701830","type":287},
    {"params":{"net_error":-101},"phase":2,"source":{"id":274038,"type":1},"time":"3332701830","type":164},
    {"params":{"net_error":-101},"phase":2,"source":{"id":274038,"type":1},"time":"3332701830","type":97},
    {"phase":1,"source":{"id":274038,"type":1},"time":"3332701830","type":105},
    {"phase":2,"source":{"id":274038,"type":1},"time":"3332701830","type":105},
    {"phase":2,"source":{"id":274043,"type":8},"time":"3332701830","type":38},
    {"phase":2,"source":{"id":274043,"type":8},"time":"3332701830","type":38},
    {"phase":2,"source":{"id":274043,"type":8},"time":"3332701830","type":34},
    {"params":{"net_error":-101},"phase":2,"source":{"id":274038,"type":1},"time":"3332701830","type":2},
    
    3 回复  |  直到 5 年前
        1
  •  4
  •   Vikas Yadav    6 年前

    错误连接复位 通常意味着到服务器的连接已停止,而没有向客户端发送任何响应。这意味着整个php进程已经停止,无法正常关闭。

    这通常不是由 exceeded memory_limit . 可能是分割错误之类的。如果您有权访问错误日志,请检查它们。否则,你可能会得到你的托管公司的支持。

    我建议你试试这些东西:

    1)尝试清理浏览器的缓存。如果您已经访问过该页面,则缓存可能包含与网站当前版本不匹配的信息,从而阻止连接设置,使 错误连接复位 出现消息。

    2)将以下内容添加到您的设置中:

    memory_limit = 1024M
    
    max_input_vars = 2000
    
    upload_max_filesize = 300M
    
    post_max_size = 300M
    
    max_execution_time = 990
    

    3)尝试在表单中设置以下输入:

    <input type="hidden" name="MAX_FILE_SIZE" value="300000000" /> 
    

    4)在处理脚本中,增加 会话超时 :

    set_time_limit(200); 
    

    5)你可能需要调整 SSL缓冲区大小 在您的apache配置文件中。

    SSLRenegBufferSize 10486000
    

    conf文件的名称和位置因发行版而异。

    在debian中,您可以在 /etc/apache2/sites-available/default-ssl.conf

    6)有几次 mod_security module 这样可以防止大约171kb的大数据投递。尝试在mod_security.conf中添加/修改以下内容

    SecRequestBodyNoFilesLimit 10486000
    SecRequestBodyInMemoryLimit 10486000
    

    我希望能有结果!

        2
  •  1
  •   murtuza hussain    6 年前

    我也有同样的问题。我使用了可恢复的文件上传方法,如果Internet断开连接并重新连接,则从相同的进程继续上传。

    去图书馆看看 https://packagist.org/packages/pion/laravel-chunk-upload

    1. 安装

    composer require pion/laravel-chunk-upload

    1. 添加服务提供商

    \Pion\Laravel\ChunkUpload\Providers\ChunkUploadServiceProvider::class

    1. 发布配置

    php artisan vendor:publish --provider="Pion\Laravel\ChunkUpload\Providers\ChunkUploadServiceProvider"

        3
  •  1
  •   A. STEFANI    6 年前

    在我看来,它可能与其中一个有关:

    关于 阿帕奇 配置( /etc/httpd2/conf 欧点 /etc/apache2/conf ):

    Timeout 300
    max_execution_time = 300
    

    关于 PHP 配置(“php.ini”):

    upload_max_filesize = 2000M
    post_max_size = 2000M
    max_input_time = 300
    memory_limit = 3092M
    max_execution_time = 300
    

    关于 波斯特雷斯尔 配置(执行此请求):

    SET statement_timeout TO 0;
    

    关于 代理 ,(或apache mod_proxy),也可能是由于代理超时配置

        4
  •  1
  •   Raul    5 年前

    我也遇到过类似的问题 修改请求超时 加入:

    RequestReadTimeout header = 20-40, MinRate = 500 body = 20, MinRate = 500
    

    httpd.conf成功了! 你可以查看文档 here .

    希望有帮助!