Ubuntu Apache环境下PHP图片接口net::ERR_INCOMPLETE_CHUNKED_ENCODING报错求助
问题分析与解决
可能的原因
- 输出缓冲未正确处理:PHP默认开启输出缓冲,当用
readfile传输大文件时,缓冲无法及时刷新或被截断,导致二进制图片数据没有完整发送。尤其是缓冲大小不足以容纳整个文件时,容易出现传输中断,且每次停止位置随机。 - Apache压缩模块冲突:如果Apache启用了
mod_deflate或gzip压缩,对PHP接口的输出进行压缩处理,而图片本身已是压缩格式(如JPG、PNG),二次压缩会破坏分块传输的编码结构,引发浏览器解析错误。 - 隐性输出破坏响应结构:脚本或其引入的文件中存在多余输出(比如文件开头的BOM头、空格、未关闭的echo语句),这些字符会混入图片二进制数据前,导致分块传输的格式被破坏,浏览器无法识别完整的响应内容。
- 文件读取异常:虽然能加载部分内容,但如果传输过程中文件被修改、权限变更,或者磁盘I/O出现临时异常,会导致
readfile提前终止,无法读取完整文件内容。
与请求超时的区别
- 请求超时是指浏览器在指定时间内未收到服务器的任何响应数据,直接抛出超时错误(如Chrome的
net::ERR_TIMED_OUT),不会有任何内容加载,状态码通常为408或无状态码。 - 本次问题是服务器已开始传输数据,但内容不完整或格式错误,浏览器能接收到部分内容并加载,状态码为200,但因响应不符合HTTP规范(分块编码错误、内容长度不匹配),触发
ERR_INCOMPLETE_CHUNKED_ENCODING这类传输不完整的错误。
解决建议
- 清空并关闭输出缓冲:在输出图片前添加代码,确保缓冲不干扰二进制传输:
ob_clean(); // 清空输出缓冲 flush(); // 刷新缓冲 header("Content-type: image/$format"); readfile(ROOTPATH . $src); exit; // 终止脚本,避免后续隐性输出 - 禁用当前请求的压缩:通过HTTP头关闭压缩,避免与图片二进制冲突:
或在Apache配置中,对图片接口路径单独禁用header('Content-Encoding: none');mod_deflate:<Location "/your-image-api-path"> SetEnv no-gzip 1 </Location> - 检查隐性输出:排查所有PHP文件(包括引入的公共文件),确保没有多余的空格、BOM头或未预期的echo/print语句。可以用文本编辑器查看文件开头是否有隐藏字符,或开启PHP的
display_errors检查是否有错误输出混入。 - 分块读取输出替代readfile:如果
readfile仍有问题,改用分块读取的方式,更可控:ob_clean(); flush(); header("Content-type: image/$format"); $file = fopen(ROOTPATH . $src, 'rb'); while (!feof($file)) { echo fread($file, 4096); flush(); } fclose($file); exit;
内容的提问来源于stack exchange,提问作者hsut2k
相关产品推荐
相关产品推荐

