上传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
相关产品推荐
相关产品推荐

