php读取大日志文件,怎么玩?
急急急急急急急急
本人是一名php新手,刚到公司1周左右...
项目经理给了我一个任务.
用户访问网站产生的日志文件有点大2.5g多(Nginx)
文件是这样的:
2xx.2x.1x7.1x0 - - [20/Jul/2015:16:55:34 +0800] "GET /index.php?s=User&m=User&a=shownotice&id[
0]=exp&id[1]==0))+union+select+1,1,0,5,0,(select%20concat(create_time,get_data)%20from%20log%20where%20content='%E4%BF%AE%E6%94%B9%E7%AE%A1%E7%90%86%E5%91%98'%20order%20by%20id%20desc%20limit%209,1),0,0,0,0+--%20 HTTP/1.1" 200 2153 "http://www.abcc.com/index.php?s=User&m=User&a=shownotice&id[0]=exp&id[1]==0))+union+select+1,1,0,5,0,(select%20concat(create_time,get_data)%20from%20log%20where%20content='%E4%BF%AE%E6%94%B9%E7%AE%A1%E7%90%86%E5%91%98'%20order%20by%20id%20desc%20limit%209,1),0,0,0,0+--%20" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) CometHTTP" -.
这些字符串里有些有SQL注入,有些是访问没成功的.还有后缀名为.js | .css | .jpg
因为日志是一行一行的,只要其中一行包含.js.css.jpg.
请求失败的为 404 成功的是 200,如果成功的就写入到一个新的文本文件里.只要包含.js.css.jpg.png之类的就删掉,好像是404的话就把404给删除了
并且像这样的日期-> [20/Jul/2015:16:55:34 +0800]
转换成正常的年月日,
日志文件的行数在 840万行左右....我用sublime打开我机器都卡死了.****
我想了下用到什么 fopen函数,file_get_contents函数,stream_get_line函数..
不知道咋写...有点着急..项目经理要在**周一 下午完成**...
请各位大牛帮帮忙,最好给点实例..给点思路,给点函数.
我觉得不算抄.抄的好,就是自己的抄懂了..
谢谢
这么大的文件,应该一行一行进行处理,不能一次加载到内存。
1 $line = ''; 2 3 $f = fopen('data.txt', 'r'); 4 $cursor = -1; 5 6 fseek($f, $cursor, SEEK_END); 7 $char = fgetc($f); 8 9 /** 10 * Trim trailing newline chars of the file 11 */ 12 while ($char === "\n" || $char === "\r") { 13 fseek($f, $cursor--, SEEK_END); 14 $char = fgetc($f); 15 } 16 17 /** 18 * Read until the start of file or first newline char 19 */ 20 while ($char !== false && $char !== "\n" && $char !== "\r") { 21 /** 22 * Prepend the new char 23 */ 24 $line = $char . $line; 25 fseek($f, $cursor--, SEEK_END); 26 $char = fgetc($f); 27 } 28 29 echo $line;
大文件读取就是使用流读取
要用到的日志还是存数据库吧,或者按周/月/年等存储;
另外,要读取大文件,就必须要用文件流,一次性这么大的数据,加载到内存不易;
最后,你的任务是整理这份日志文件吧,不一定非要用php实现;
要读取大文件,就必须要用文件流,文件流,文件流,重好事情说三遍!!!
看着就头大,我是来学习的。
文件流读取,一行行或者一片片,分片咋么分?
查找符合要求的用正则么?