PHP 读取大文件

kevin.Zhu 发布于:2013-1-16 15:41 分类:Php  有 8 人浏览,获得评论 0 条  

最近在工作中遇到了需要读取系统日志的问题,日志文件很大,大概在1G以上甚至更大,随即研究了读取得方法,直接使用PHP自带的函数就可以解决这几个问 题,但是绝对不能使用file和file_get_contents,这两个函数是一次性将文件全部加载进来,如果文件在几十M 还是可以的,但是稍大的文件时不能用的,内存是会溢出的 ,贴个自己的方法,欢迎大家指教!


<?

/**

* PHP 读取大文件 测试文件大于1G的文本文件

*

* @copyright(c) 2010 by 高成. All rights reserved

* @author 高成

*

*/

/**

* 文件读取

*

* @param String $filename 文件地址

* @param Int $count 读取得行数

* @param String $sep 每行的分隔标记

* @return String 返回结果

*/

function readBigFile($filename, $count = 20, $tag = '\r\n') {

    $content = '';//最终内容

    $_current = '';//当前读取内容寄存

    $step= 1;//每次走多少字符

    $tagLen = strlen($tag);

    $start = 0;//起始位置

    $i = 0;//计数器

    $handle = fopen($filename,'r+');//读写模式打开文件,指针指向文件头

    while($i < $count && !feof($handle)) {    //文件没有到结尾和小鱼需要读取得行数时

        fseek($handle, $start, SEEK_SET);//指针设置在文件开头

        $_current = fread($handle,$step);//读取文件

        $content .= $_current;//组合字符串

        $start += $step;//依据步长向前移动

        //依据分隔符的长度截取字符串最后免得几个字符

        $substrTag = substr($content, -$tagLen);

        if ($substrTag == $tag) {    //判断是否为判断是否是换行或其他分隔符

            $i++;

        }

    }

    //关闭文件

    fclose($handle);

    //返回结果

    return $content;

}

$filename = 'E:/2010log.log';//需要读取的文件

$tag = '\r\n';//行分隔符 注意这里必须用双引号

$count = 20;//读取行数

$data = readBigFile($filename,$count,$tag);

echo $data;

?>