最近在工作中遇到了需要读取系统日志的问题,日志文件很大,大概在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 :/ 2010 log . log ’; // 需要读取的文件
$tag = “\r\n”; // 行分隔符 注意这里必须用双引号
$count = 20 ; // 读取行数
$data = readBigFile( $filename , $count , $tag );
echo $data ;
?>
/* *
* 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 :/ 2010 log . log ’; // 需要读取的文件
$tag = “\r\n”; // 行分隔符 注意这里必须用双引号
$count = 20 ; // 读取行数
$data = readBigFile( $filename , $count , $tag );
echo $data ;
?>
PHP还有其他方法能够解决,比如system函数,不足之处还望指正!