PHP对大文件进行读取切割拆分

2019-12-27 18:08:01 浏览数 (1)

近期在对项目日志进行分析时,发现日志文件较大,里面的文件行数也较多,使用编辑器进行打开或使用分析工具打开时较慢,于是将其拆分成多个小文件,便于对其进行分析、查看。

测试时将一份10000多行的文本文件进行了拆分,按照每一份文件5000行为基础,大约 消耗了4秒的时间,就成功的对文件进行了拆分。下面是实例代码:

代码语言:javascript复制
<?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);
    }
}

?>

设置了一些基础的参数,如文件后缀,单文件储存量,默认存储位置等,便于大家进行更改,主要是使用了生成器,在对大文件进行读取时,占用内存很少,是一个很好的方法。

0 人点赞