首页新闻找找看学习计划

PHP读取大日志文件,怎么玩?急急急急急急急

0
悬赏园豆:100 [待解决问题]

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函数..
不知道咋写...有点着急..项目经理要在**周一 下午完成**...
请各位大牛帮帮忙,最好给点实例..给点思路,给点函数.
我觉得不算抄.抄的好,就是自己的抄懂了..
谢谢

ooplus的主页 ooplus | 初学一级 | 园豆:102
提问于:2015-10-12 01:51
< >
分享
所有回答(6)
1

这么大的文件,应该一行一行进行处理,不能一次加载到内存。

 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;
JackWang-CUMT | 园豆:2826 (老鸟四级) | 2015-10-12 08:13
0

大文件读取就是使用流读取

吴瑞祥 | 园豆:28729 (高人七级) | 2015-10-12 09:26
1

要用到的日志还是存数据库吧,或者按周/月/年等存储;

另外,要读取大文件,就必须要用文件流,一次性这么大的数据,加载到内存不易;

最后,你的任务是整理这份日志文件吧,不一定非要用php实现;

幻天芒 | 园豆:36522 (高人七级) | 2015-10-13 13:50
0

一楼正解,一点点读吧,读的时候只读一部分,只读一个片段就可以了。

````` | 园豆:14268 (专家六级) | 2015-10-13 15:15
0

要读取大文件,就必须要用文件流,文件流,文件流,重好事情说三遍!!!

方块李 | 园豆:172 (初学一级) | 2015-10-16 14:40
0

看着就头大,我是来学习的。

 

文件流读取,一行行或者一片片,分片咋么分?

查找符合要求的用正则么?

小刺猬001 | 园豆:656 (小虾三级) | 2015-12-01 15:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册