文档章节

php统计nginx访问日志的ip访问量

koobur
 koobur
发布于 2016/07/06 11:18
字数 446
阅读 295
收藏 2

逐字节读取分析,性能杠杠的。话不多说,直接上代码

  • 编写文件test01.php

//文件大小 4.8G
$filepath = '/usr/local/nginx/logs/acc.log';

$f = fopen($filepath, 'r');

$i = 0; //行数
$ipcount = []; //ip
while (!feof($f)) {    
    $str = fread($f, 1024*1024*2); //每次读2m
    
    $lines = explode("\n", $str);    
    foreach($lines as $line) {
        if(!$line){
            continue;
        }
        $ip = substr($line, 0, strpos($line, '- -')-1);
        if(ip2long($ip) === false) {
            continue;
        }
        $ipcount[$ip] = isset($ipcount[$ip]) ? $ipcount[$ip] : 0;
        $ipcount[$ip]++;
    }

    $num = substr_count($str, "\n");
    $i += $num;
}
fclose($f);

//输出结果写入文件
$str1 = "Lines:$i \n";
file_put_contents('/tmp/a.log', $str1, FILE_APPEND);

foreach($ipcount as $ip=>$count){
    file_put_contents('/tmp/a.log', $ip . ':' . $count . "\n", FILE_APPEND);
}
  • 经过服务器测试

耗时:

输入图片说明

输出结果:

输入图片说明

只做行数统计 耗时

输入图片说明

和shell命令 wc 比较

输入图片说明

  • 但是我发现有一个问题,数据貌似不对,有个别地址被截断了。如图

输入图片说明

猜测应该是恰好读取到ip地址中间,所以ip地址就被截断了,所以我又优化了一下

//文件大小 4.8G
$filepath = '/usr/local/nginx/logs/acc.log';

$f = fopen($filepath, 'r');

$i = 0; //行数
$ipcount = []; //ip
$len = 1024*1024*2; //每次读2m

while (!feof($f)) {    
    $str = fread($f, $len);

    if (!feof($f)) {
        $pos1 = ftell($f);//当前文件指针位置

        $pos2 = (int) strrpos($str, PHP_EOL); // `\n` 在 $str中 最后一次出现的位置

        $pos3 = $len - $pos2 - 1; // 从`\n`在字符串($str)最后一次出现的位置 到 字符串($str)末尾de 字节长度

        fseek($f, $pos1 - $pos3); // 重新指定文件指针位置
        
        $str = substr($str, 0, $len-$pos3);                
    }
    
    $lines = explode(PHP_EOL, $str);    
    foreach($lines as $line) {
        if(!$line){
            continue;
        }
        $ip = substr($line, 0, strpos($line, '- -')-1);
        if(ip2long($ip) === false) {
            continue;
        }
        $ipcount[$ip] = isset($ipcount[$ip]) ? $ipcount[$ip] : 0;
        $ipcount[$ip]++;
    }

    $num = substr_count($str, PHP_EOL);
    $i += $num;
}
fclose($f);

//输出结果写入文件
$str1 = "Lines:$i \n";
file_put_contents('/tmp/a.log', $str1);

foreach($ipcount as $ip=>$count){
    file_put_contents('/tmp/a.log', $ip . ':' . $count . "\n", FILE_APPEND);
}

那么现在,完美

© 著作权归作者所有

koobur
粉丝 11
博文 17
码字总数 11225
作品 0
昌平
高级程序员
私信 提问
Nginx Access Log日志统计分析常用命令

Nginx Access Log日志统计分析常用命令 Nginx Access Log日志统计分析常用命令 IP相关统计 统计IP访问量 awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时间段的IP访问量(...

quyong911
2018/06/26
0
0
Nginx Log日志统计分析常用命令

Nginx Log日志统计分析常用命令 IP相关统计 统计IP访问量(独立ip访问数量) awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时间段的IP访问量(4-5点) grep "07/Apr/2017:0......

linjin200
2018/11/08
0
0
nginx访问量统计

nginx访问量统计1.根据访问IP统计UV awk '{print $1}' access.log sort uniq -c wc -l 2.统计访问URL统计PV awk '{print $7}' access.log wc -l 3.查询访问最频繁的URL awk '{print $7}' ac......

ning8167
2017/12/15
0
0
如何查看nginx状态?如何统计访问量?

nginx是个什么玩意儿本文不再多说,直奔主题! 1. 如何查看nginx的状态? stub_status 模块介绍 stub_status 模块主要用于查看Nginx的一些状态信息. 本模块默认是不会编译进Nginx的,如果你要...

蜗牛的嘲讽
2016/12/19
0
0
awstats访问日志分析-haproxy,nginx后端的tomcat access日志

使用场景: 基于awstats的日志访问统计系统,用于分析统计网站页面访问量,为后期扩展提供依据。 公司网站架构: 一部分应用采用haproxy+tomcat,一部分采用nginx+tomcat(nginx通过域名分发请...

typuc
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

UserInputControls用户输入控制

enum UserInputControls { kGovernedByOrthoMode = 0x0001,//正交模式管理 kNullResponseAccepted = 0x0002,//允许输入空 kDontEchoCancelForCtrlC = 0x0004,//ctrl C 模式不能重复......

一个小妞
7分钟前
0
0
分布式系统的事务处理

当我们在生产线上用一台服务器来提供数据服务的时候,我会遇到如下的两个问题: 1)一台服务器的性能不足以提供足够的能力服务于所有的网络请求。 2)我们总是害怕我们的这台服务器停机,造成...

群星纪元
9分钟前
0
0
Kanban VS Scrum:哪个是最好的敏捷项目管理框架

“我们使用敏捷开发。”在与软件开发团队交流时,你会听到很多这样的说法。根据统计,2018年全球约有90%的开发人员在使用敏捷开发。Choerodon猪齿鱼团队也是其中之一。 但是,敏捷并不统一。...

Choerodon
13分钟前
0
0
vue select 慢一步

我在使用vue的select的时候,@change事件里面,写一个axios拿到数据,然后修改某个变量,按理修改变量会立即呈现在页面上面,但实际情况是,值是变更了,但是页面上的效果慢了一步,非常奇怪...

朝如青丝暮成雪
17分钟前
0
0
分布式架构 核心知识体系

1.问题 1、何为分布式何为微服务? 2、为什么需要分布式? 3、分布式核心理论基础,节点、网络、时间、顺序,一致性? 4、分布式是系统有哪些设计模式? 5、分布式有哪些类型? 6、如何实现分...

小刀爱编程
20分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部