
PHP readfile函数下载大文件不完整问题及解决方案
使用PHP的readfile函数下载大文件(例如500MB的zip压缩包)时,经常会遇到下载不完整的问题。尤其当文件大小接近或超过服务器输出缓冲区大小时,这个问题更为明显。 表现通常是小文件下载正常,而大文件则部分内容丢失。
以下是一个使用readfile下载生成的zip压缩包的示例代码:
self::addfiletozip('./answerzip/', $zip); // 将文件添加到zip压缩包
$zip->close(); // 关闭压缩包
header('content-disposition: attachment; filename=' . basename($filename));
header("content-type: application/zip");
header("content-transfer-encoding: binary");
header('content-length: ' . filesize($filename));
// ob_clean(); // 注释掉的缓冲区清理
// flush(); // 注释掉的缓冲区刷新
readfile($filename);
问题根源在于PHP的输出缓冲区。当readfile向缓冲区写入数据时,如果缓冲区已满,部分数据可能会被丢弃,导致下载不完整。 虽然代码中注释了ob_clean()和flush(),但它们并不能完全解决问题,因为输出缓冲区的行为受服务器配置影响。
立即学习“PHP免费学习笔记(深入)”;
欢迎使用ChuangxinCMS企业网站管理系统软件! ChuangxinCMS是一个采用PHP技术和MYSQL数据库开发的企业网站管理系统,使用ChuangxinCMS能在最短的时间内花费最少的成本来搭建一个功能完善的企业网站,ChuangxinCMS具有一系列完善的内容管理功能,包括文章发布、分类管理、产品发布展示、下载模块等,整个系统页面设计简洁大方,功能实用高效,是中小型企业建站的最佳选择
解决方案:禁用或调整PHP输出缓冲区
最有效的解决方法是禁用PHP输出缓冲区。 通过设置output_buffering为0,可以避免缓冲区带来的数据丢失:
ini_set('output_buffering', 0);
将这行代码添加到readfile函数调用之前。 这样,readfile可以直接将文件内容发送到客户端,避免了大文件下载不完整的问题。
需要注意的是,禁用输出缓冲可能会略微降低性能,但为了保证大文件下载完整性,这是一个必要的权衡。










