您的位置:首页 > 编程语言 > PHP开发

php读取大文件

2016-05-08 20:48 423 查看
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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: