喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
 13  1/2  1  2  > 
     
标题: [原创] 网站日志分析  
 
ice024 (ice024)
新手上路
Rank: 1
初级会员



UID 20808
精华 0
积分 36
帖子 49
金钱 36 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-6-16
状态 离线
网站日志分析

今天上网看到一则网上招聘的题目中有关于网站日志分析的题目,由于有时间就弄了个程序,大家给评评!
基本思路:
1、日志文件格式分析
127.0.0.1 - - [15/Nov/2006:22:16:49 +0800] "GET /sqlitemanager/theme/green/pics/browse2.png HTTP/1.1" 304 -
上面的格式可以用正则取出其中的ip,时间,http,状态等数据
2、由于要有汇总数据,一个基本想法是如果用数据库的话将会非常简单。于是想到用SQLite这个数据库,这个数据库可以直接将临时数据库建在内存中。由于只对数据库的操作比较熟悉,不知道是否能够直接用数组进行各种统计和查询。
具体代码见附件,欢迎各种意见!

哦对了,测试的时候将日志文件弄小了,如果太大可能时间会很长!

<?php
$file 
'E:/Program Files/wamp/logs/access.log';
/* 判断日志文件是否可读 */
if (!is_readable($file)) {
   echo 
'日志文件路径不对,请核对!';die();

/* 将网站日志文件读到$content数组中 */
$content=file($file);
/* 构建$logs数组,为分析做准备 这里是以一条典型记录为模型进行正则分析获得相对应的数据 */
foreach($content as $row){
  
$pattern="!^(.*?)s-s-s[(.*?)]s\"(.*?)\"s(.*?)s(.*)$!";
  
preg_match($pattern,$row,$matches);
  
$log['ip']=$matches[1];
  
$log['date']=$matches[2];
  
$log['Http']=$matches[3];
  
$log['status']=$matches[4];
  
$log['CLF']=$matches[5];
  
$logs[]=$log;
}
/* 建立临时数据库存放网站记录数据 */
$db=new SQLiteDatabase(':memory:');
$sql='CREATE TABLE logs ( id INTEGER PRIMARY KEY, ip VARCHAR , date VARCHAR , Http VARCHAR , status VARCHAR , CLF VARCHAR )';
$db->query($sql);
/* 将$logs中的数据插入到这个临时数据库中,这里用到了事务,不过因为在内存中,速度影响不大 */
$db->query('BEGIN TRANSACTION ');
foreach(
$logs as $log){
if(
$log[ip]){//条件判断数组数据是否为空!分析的时候发现最后一行数据是空的!
$sql="INSERT INTO logs ( id , ip , date , Http , status , CLF ) 
VALUES ( NULL , '"
.$log['ip']."' , '".$log['date']."' , '".$log['Http']."' , '".$log['status']."' , '".$log['CLF']."' ) ";
$db->query($sql);}
}
$db->query('COMMIT TRANSACTION ');

/* 根据建立的数据库进行各种分析 */

/* 网页状态分析 */
$sql='SELECT status,count(id) as count FROM logs GROUP BY status order by count DESC ';
$rs=$db->query($sql);
$status=$rs->fetchall(SQLITE_ASSOC);
/* IP地址来源分析 */
$sql='SELECT ip,count(id) as count FROM logs GROUP BY ip order by count DESC';
$rs=$db->query($sql);
$ip=$rs->fetchall(SQLITE_ASSOC);
/* 网页访问强度分析 */
$sql='SELECT Http,count(id) as count FROM logs GROUP BY Http Having count>10 order by count DESC ';
$rs=$db->query($sql);
$Http=$rs->fetchall(SQLITE_ASSOC);
/* 时间分析 按天计算
  这里建立一个函数,用这个函数在SQLite数据库中对日期进行调整!变为天!
 */
function mydate($date){
  return 
date('Y-m-d',strtotime($date));
}
$db->createFunction('mydate','mydate',1);
$sql='SELECT mydate(date) as dday,count(id) as count FROM logs GROUP BY dday Having count>10 order by dday DESC ';
$rs=$db->query($sql);
$mydate=$rs->fetchall(SQLITE_ASSOC);

/* 将这些结果进行展示,这部分一般可以单独放在一个模板文件中*/
?>
[ 本帖最后由 ice024 于 2006-11-18 04:41 PM 编辑 ]


 附件: 您所在的用户组无法下载或查看附件
2006-11-18 04:37 PM#1
查看资料  发短消息  顶部
 
ice024 (ice024)
新手上路
Rank: 1
初级会员



UID 20808
精华 0
积分 36
帖子 49
金钱 36 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-6-16
状态 离线
[推荐阅读] 一个乱码严重的问题mysql 4.1
具体代码见附件,帖子中的代码有一些小问题!
2006-11-18 04:43 PM#2
查看资料  发短消息  顶部
 
ice024 (ice024)
新手上路
Rank: 1
初级会员



UID 20808
精华 0
积分 36
帖子 49
金钱 36 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-6-16
状态 离线
[推荐阅读] 关于str_replace问题
晚上上网做了一些功课,调查一下,Apache服务器的日志管理,下面的网址有一篇非常好的文章。
http://www.99power.com/wz_108891/
这个网址应该不是原创网址,有人知道请告知。

通过调查,发现原来日志管理不仅是对Access.log的管理,同时也应对错误进行管理。上面的程序没有考虑这些,以后有时间可以考虑进行改进。

为了防止日志文件不断变大,其实可以弄一个数据库(例如SQLite数据库)进行管理,每次运行这个PHP脚本,就将日志文件清空,并将内容插入到这个数据库中。只是不知道是否有定期自动运行脚本的工具?

对日志文件的统计分析,这篇文章中提出了许多值得思考的问题。
例如在时间分析中,提出了从时间上可以看出访问者都在什么时间访问这个网站(上班时间,还是下班时间)。
错误链接的问题可以帮助我们对网站进行优化!
2006-11-18 09:14 PM#3
查看资料  发短消息  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 上海乐拓数据中心诚招代理|虚拟主机|企业邮局|域名注册-蒋少军-13585956977
好象日志达到一定大小时自动分割为几个文件的



五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-11-19 08:33 PM#4
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
hszhl
注册会员
Rank: 2



UID 72628
精华 0
积分 55
帖子 49
金钱 55 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-4-30
状态 离线
[推荐阅读] [职位]上海静安区 招聘PHP Programmer [new]
通过对日志数据的分析,处理达到分析网站的流量,信息等的目的,确实不错,值得借鉴!收了......
2006-11-20 10:35 PM#5
查看资料  发短消息  顶部
 
fcicq
新手上路
Rank: 1
初级会员



UID 24467
精华 0
积分 21
帖子 587
金钱 20 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2003-11-8
来自 fcicq.net
状态 离线
[推荐阅读] 请教一个关于采集链接的问题
用php太复杂,这种东西命令行就足够了.




2006-11-22 09:13 PM#6
查看资料  访问主页  Blog  发短消息  顶部
 
starDust
注册会员
Rank: 2



UID 72487
精华 0
积分 135
帖子 153
金钱 135 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-4-28
状态 离线
[推荐阅读] 我公司有大量的非常优秀的商业性质的中英文域名。有兴趣开发网站赚钱的,请和我联系。
cronolog+analog



原来是基因改造了世界
2006-11-23 09:24 AM#7
查看资料  发短消息  顶部
 
ice024 (ice024)
新手上路
Rank: 1
初级会员



UID 20808
精华 0
积分 36
帖子 49
金钱 36 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-6-16
状态 离线
[推荐阅读] return后的怪现象
今天重新测试这段程序的时候,发现日志文件已经变得太大,不能运行了。所以重新对程序作了调整,用数组的相关函数代替将数据弄到数据库中的做法!
如此修改后,发现程序的运行时间从30秒多变为现在的0.3秒!呵呵,巨大的变化!

<?php
/* 将Windows的路径习惯改称Unix的路径方式 这个路径直接从资源管理器中拷贝出来*/
$file preg_replace("!\!""/"'E:Program Fileswamplogs/access.log');
/* 判断日志文件是否可读 */
if (!is_readable($file)) {
   echo 
'日志文件路径不对,请核对!';die();

/* 将网站日志文件读到$content字符串中 */$content=file_get_contents($file);
/* 对单条记录进行正则匹配*/
$pattern='!(d+.d+.d+.d+)s-s-s[([^:]*):(d+)[^]]*]s"([^s]*)s([^s]*)s([^"]*)"s(d+)s(d+|-)!';
preg_match_all($pattern,$content,$matches);
/* 将匹配后的结果赋值给各个数组*/
$ip=$matches[1];
$day=$matches[2];
$hour=$matches[3];
$method=$matches[4];
$url=$matches[5];
$protocal=$matches[6];
$status=$matches[7];
$syze=$matches[8];


//对ip地址的访问分析
$count_ip=array_count_values($ip);
arsort($count_ip);

//对url的分析
$count_url=array_count_values($url);
arsort($count_url);

//对日期的分析
$count_day=array_count_values($day);

//对小时的分析
$count_hour=array_count_values($hour);
ksort($count_hour);
//对状态的分析
$count_status=array_count_values($status);
ksort($count_status);
?>
[ 本帖最后由 ice024 于 2006-11-24 02:23 AM 编辑 ]


 附件: 您所在的用户组无法下载或查看附件
2006-11-24 02:18 AM#8
查看资料  发短消息  顶部
 
uuq
高级会员
Rank: 4
中级会员


UID 28149
精华 1
积分 821
帖子 859
金钱 811 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2004-4-27
来自 广州
状态 离线
[推荐阅读] &=和^=操作符怎么理解呀?
php不行的,日志文件太大了
你可以这样,在apache里面设置php接收日志内容就可以了
2006-12-29 08:52 PM#9
查看资料  发短消息  顶部
 
phphp
版主
Rank: 7Rank: 7Rank: 7
加班一族


UID 65188
精华 1
积分 182
帖子 3005
金钱 171 喜悦币
威望 10
人脉 1
阅读权限 100
注册 2005-7-20
来自 北京市海淀区
状态 离线
[推荐阅读] 有开源的搜索程序吗?
直接file也行?



书到用时方恨少, 事非经过不知难
2006-12-29 11:39 PM#10
查看资料  访问主页  Blog  发短消息  QQ  顶部
 13  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.030699 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP