PHP对大文件进行读取切割拆分
近期在对项目日志进行分析时,发现日志文件较大,里面的文件行数也较多,使用编辑器进行打开或使用分析工具打开时较慢,于是将其拆分成多个小文件,便于对其进行分析、查看。
测试时将一份10000多行的文本文件进行了拆分,按照每一份文件5000行为基础,大约 消耗了4秒的时间,就成功的对文件进行了拆分。下面是实例代码:
<?php $suffix = '.txt';//保存文件后缀 $i = $start = 0; //起始量 $num = 5000; //单文件存储量 $path = './txt/cutting/'; //默认存储文件位置 $filePath = './txt/20191025/7088479afbb763371bc0e28b33d16bc5.txt'; //切割文件位置 // 使用 $glob = $this->read_file($filePath); while($glob->valid()) { // 当前行文本 $line = $glob->current(); // 逐行处理数据进行存储 if($i % $num == 0) { //创建新的文件 $start++; } //写入文件 $file = fopen($path . 'cutting_' . $start . $suffix, "a"); fwrite($file, $line . "\n"); $i++; // 指向下一个,不能少 $glob->next(); } echo "共计" . $i . "行"; //文件读取 function read_file($path) { if($handle = fopen($path, 'r')) { while(!feof($handle)) { yield trim(fgets($handle)); } fclose($handle); } } ?>
设置了一些基础的参数,如文件后缀,单文件储存量,默认存储位置等,便于大家进行更改,主要是使用了生成器,在对大文件进行读取时,占用内存很少,是一个很好的方法。