PHP如何分段读取大型gz压缩文件 从指定位置读取指定长度内容
PHP读取超大gz压缩文件分段提取内容方案
核心逻辑说明
gzip是基于流的压缩格式,无法像未压缩文件一样直接指定任意偏移位置读取,因为每个压缩块的解码依赖前面数据生成的字典。但你不需要手动管理偏移,gzread 调用后会自动推进文件句柄的读取指针,只要循环调用直到读取到文件末尾即可读完整个文件。
修复后可运行代码
<?php $filename = "my_big_file.txt.gz"; $zd = gzopen($filename, "r"); // 单次读取字节数,可根据服务器内存情况调整大小 $read_size = 1000000; // 存储上一个读取块末尾未匹配完成的残留内容,避免分隔符被切分导致漏匹配 $last_chunk = ''; while (!gzeof($zd)) { // 读取指定长度内容,和上一段残留拼接后再拆分 $readfile = $last_chunk . gzread($zd, $read_size); $tmp_array = explode("IT\\", $readfile); // 取出最后一个不完整的元素,留到下一次读取后拼接处理 $last_chunk = array_pop($tmp_array); unset($tmp_array[0]); foreach ($tmp_array as $row) { $full_id = explode(" ", $row); echo $full_id[0]; echo "<br>"; } } // 处理最后剩余的内容 if (!empty($last_chunk)) { $full_id = explode(" ", $last_chunk); echo $full_id[0] ?? ''; echo "<br>"; } gzclose($zd); ?>
注意事项
- 原测试代码存在变量名错误:循环内
$full_id = explode(" ",$full_id)中$full_id未定义,已修正为拆分当前遍历的$row - 新增的残留内容拼接逻辑,可避免分隔符
IT\刚好被切分到两个读取块之间,导致匹配遗漏、数据缺失 - 调整
$read_size的数值可平衡读取效率和内存占用,数值越大读取效率越高,内存占用也越高
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

