PHP 读取大文件

最近在工作中遇到了需要读取系统日志的问题,日志文件很大,大概在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还有其他方法能够解决,比如system函数,不足之处还望指正!

 

转载于:https://www.cnblogs.com/gaocheng/archive/2010/11/12/1875317.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值