You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

上传200MB+大文件时Apache返回End of script output before headers问题求助

解决大文件分片上传时Apache返回"End of script output before headers"的问题

这个问题我之前帮同事排查过类似场景——文件明明已经成功传到目标目录,但后端没正常输出预期的JSON响应,反而让Apache抛出了这个错误,咱们一步步拆解可能的原因和解决办法:

1. 先补全超时相关的配置(不止max_execution_time)

你已经设置了max_execution_time = 3000,但大文件上传涉及的超时配置不止这一个:

  • PHP的max_input_time:这个是PHP处理请求输入(包括上传文件)的最大时间,默认通常是60秒,10分钟的上传肯定不够,得改成和max_execution_time一致甚至更长:
    max_input_time = 3000
    
  • Apache的Timeout指令:Apache默认超时时间是300秒(5分钟),你的上传耗时10分钟,这个值必须调大,在httpd.conf或者虚拟主机配置里修改:
    Timeout 600  # 10分钟,或者设3600更稳妥
    
  • upload_max_filesize和post_max_size:虽然200MB以下正常,但要确保这两个值都大于你的单分片大小(比如分片是50MB的话,设成256M就足够):
    upload_max_filesize = 256M
    post_max_size = 256M
    

2. 排查脚本是否被意外终止或输出截断

文件能上传但没响应,大概率是脚本在输出JSON前就挂了:

  • 检查内存限制:合并分片的过程可能占用较多内存,内存不足会直接导致脚本崩溃,修改memory_limit:
    memory_limit = 512M
    
  • 查看错误日志:去PHP的错误日志(php_error.log)或者Apache的错误日志(error.log)里找线索,比如有没有“Allowed memory size exhausted”或者文件权限相关的报错。也可以在脚本开头临时开启错误输出:
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
  • 排除安全软件拦截:比如ModSecurity这类WAF可能会拦截长时间的请求,导致脚本中途被中断。可以临时关闭ModSecurity测试,或者查看它的日志是否有拦截记录。

3. 修复Ajax收到错误响应的问题

你提到收到的是新页面请求响应,这一般是脚本崩溃后Apache返回了默认错误页,而非你的脚本输出:

  • 强制先输出响应头:在脚本最开头就设置JSON响应头,确保无论后续逻辑是否出错,响应类型都是正确的:
    header('Content-Type: application/json');
    
  • 检查重定向规则:看看.htaccess里有没有超时或错误重定向的规则,比如把500错误重定向到某个页面,这会导致Ajax收到重定向后的页面内容而非JSON。

4. 分片上传的特殊检查点

  • 确认每个分片的响应都正常:虽然总文件传完了,但可能最后一个分片的请求已经超时,脚本没来得及输出响应。可以在前端加日志,记录每个分片的上传状态。
  • 检查分片合并逻辑:合并时有没有权限问题?磁盘空间是否充足?这些都会导致合并失败,脚本抛出未捕获的错误,进而无法输出JSON。

内容的提问来源于stack exchange,提问作者AFwcxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:26:22