php读取大文件
2016-05-08 20:48
423 查看
1.fseek定位文件指针
方法一:
首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置,再取这一行的位置,依次类推,直到找到了$num行。
方法二:
还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换行符(\n)的个数来判断是否已经读完最后$num行数据.
2. stream_get_line
3. SplFileObject
方法一:
首先通过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; } } }
相关文章推荐
- laravel(二)migration
- PHP的mysqli扩展
- PHP访问,增删改查,小结
- thinkphp 配置多数据库
- PHP数据库操作类
- php socket通信演示以及socket操作类
- laravel(一)路由,参数传递,blade
- PHP动态网页脚本
- PHP与Mysql的连接
- 基于MT7688模块的开发笔记8——TFTP方式烧写Uboot固件
- 解决yii2左侧菜单子级无法高亮问题的方法
- preg_match_6.php
- yii2 左侧菜单子级无法高亮的问题
- yii2 左侧菜单子级无法高亮的问题
- preg_match_2.php
- strpos.php
- strrpos.php
- substr_replace.php
- str_ireplace.php
- php 正则表达式