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

fread/ob_flush/flush仅单个文件失效 求排查解决建议

解决PHP下载大型二进制文件64MB中断及AH01369错误的方案

问题根源分析

AH01369是Apache服务器的错误,说明服务器将二进制文件中的某段字节误解析为HTTP头部标签;64MB的中断临界点,大概率是缓冲区触发解析逻辑的阈值。核心问题是未正确设置响应头,导致Apache/浏览器误判输出内容类型,进而触发解析错误或中断。


具体解决步骤

1. 强制设置完整的二进制下载响应头

在输出文件内容前,必须明确告诉服务器和浏览器这是二进制附件,避免内容被误解析:

// 替换为实际的文件信息
$file_path = '/path/to/your/large/file.bin';
$file_name = 'downloaded-file.bin';
// 若文件不可直接用filesize,可通过fstat获取:fstat($l_file_handle)['size']
$file_size = filesize($file_path);

// 清空之前可能输出的内容
if (ob_get_level() > 0) ob_end_clean();

// 设置响应头
header('HTTP/1.1 200 OK');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $file_name . '"');
header('Content-Length: ' . $file_size);
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

2. 禁用PHP输出缓冲与自动压缩

避免缓冲或压缩干扰二进制输出:

@ini_set('zlib.output_compression', 0);
@ini_set('output_buffering', 'Off');
@ini_set('implicit_flush', 1);

3. 优化输出循环(或改用readfile简化代码)

  • 替换print为echo(print会返回1,虽不常见但可能引发潜在问题):
while(!feof($l_file_handle)) {
    echo fread($l_file_handle, 1024*8);
    ob_flush();
    flush();
}
  • 更推荐使用PHP原生的readfile(),它会自动处理缓冲和刷新,效率更高:
// 先设置好上述响应头
readfile($file_path);

4. 排查Apache服务器配置

  • 检查是否启用mod_deflate、mod_headers或WAF类模块(如mod_security),临时关闭测试是否是这些模块拦截了二进制内容;
  • 查看Apache错误日志,获取\xbd\x17\xc7相关的完整上下文,确认触发错误的具体模块;
  • 调整LimitRequestBody(若设置过小),但此配置针对请求而非响应,仅作排查参考。

内容的提问来源于stack exchange,提问作者glenn-at-nasa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:05:59