php读取大文件

1.fseek定位文件指针

方法一:

首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置,再取这一行的位置,依次类推,直到找到了$num行。

function tail($fp,$n,$base=5)
{
    assert($n>0);
    $pos = $n+1;
    $lines = array();
    while(count($lines)< =$n){
        try{
            fseek($fp,-$pos,SEEK_END);
        } catch (Exception $e){
            fseek(0);
            break;
        }
        $pos *= $base;
        while(!feof($fp)){
            array_unshift($lines,fgets($fp));
        }
    }
    return array_slice($lines,0,$n);
}
var_dump(tail(fopen("access.log","r+"),10));
 
 

方法二:

还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换行符(\n)的个数来判断是否已经读完最后$num行数据.

$fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0) {
    while ($t != "\n") {
        fseek($fp, $pos, SEEK_END);
        $t = fgetc($fp);
        $pos --;
    }
    $t = " ";
    $data .= fgets($fp);
    $line --;
}
fclose ($fp);
echo $data

 

2. stream_get_line

set_time_limit(0);
@ini_set('memory_limit', '64M');
 
$conn = mysql_pconnect('localhost', 'hcq', 'hcq') or die("con\'t connection db.");
mysql_select_db('log', $conn);
mysql_query('set names utf8', $conn);
 
$file = '/home/hcq/data/www.nimmin.com_20120601_access.log';
$handle = fopen($file, "r") or die("can\'t open file {$file}");
 
while($log = stream_get_line($handle, 8192, "\n")) {
    $i = explode(' ', $log);
    $path = isset($i[6]) ? str_replace('http://www.nimmin.com', '', $i[6]) : false;
    if($path) {
 preg_match('/(jpg|png|gif)/iu', $path, $m);
 if(isset($i[8]) && $i[8] === '200' && count($m) > 0) {
 $len = isset($i[9]) ? intval($i[9]) : 0;
 $refer = isset($i[12]) ? str_replace('"', '', $i[12]) : '';
 mysql_query('INSERT INTO trace(path, len, refer) VALUES (\''.$path.'\', '.$len.', \''.$refer.'\')', $conn);
 }
 }
}
 
fclose ($handle);
 
exit;

 

3. SplFileObject

foreach( glob( ngx_log. "/*.log" ) as $file ) {
    $log = new SplFileObject($file);
    foreach( $log as $line ){
        $ipnum  = getip($line);
        if( $ipnum ) {
            $ips[ $ipnum ] = (int)$ips[ $ipnum ] + 1;
        }
    }
}

 

转载于:https://www.cnblogs.com/wish123/p/5471506.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值