无需登录cPanel 用PHP解析AWStats日志数据

来源:admin  更新:2023-06-28 14:56  分类:网络技术  标签:awstats  源文件

独立建站者使用虚拟主机很多提供 cPanel控制面板 / Plesk控制面板,并具有访问统计功能如 Awstats,解析AWStat文件是一种获取关键统计数据的简单方法,无需在服务器或网站上添加另一个日志解析器或网站跟踪系统,不需要安装百度统计、谷歌统计。但查看AWStat分析日志需要在cPanel控制面板上操作。每次需要登录比较繁琐,而在虚拟空间中使用php程序快速解析AWStats数据,能让独立建站者快速掌握网站的访问统计情况,并可以按照自己的需求定制相关指标的对比和变化趋势,以便各位站长在后续改进

选择 AWStat统计 的原因是,几乎每个共享主机服务器都已经安装了AWStat,并且将AWStat安装到自己的云服务器上也非常简单,这使AWStat成为更受欢迎的本地跟踪系统之一。AWStat的速度非常快,并且不会为每次访问耗尽资源,因为AWStat每天解析一次日志文件,并且不会在每次访问时插入每个用户的新记录

Awstats主要功能:

  • 1、详细的按时间统计。目前提供了按月统计、按日期统计、按星期统计以及每小时浏览量等功能,并提供直观的数据图片。
  • 2、按国家和地区统计访问者的地理位置,默认显示前25个访客最多的国家和地区。
  • 3、统计访客的IP地址,访问页面的次数和产生的流量以及详细的访问时间表。
  • 4、统计出搜索引擎的访问。
  • 5、统计访客的停留时间。
  • 6、统计访问量最多的文件类型,按照访问百分比从高到底排列。
  • 7、统计访问量最大的链接地址。(最多支持25个有效链接。)
  • 8、统计访客使用的浏览器和操作系统。
  • 9、统计访客的来路。
  • 10、统计网站本身额http错误。

用PHP解析AWStats数据代码

只有描述如何解析这些文件的PHP代码。离开PHP代码,读者应该能够在不到一个小时的时间内制作自己的PHP解析AWStats数据程序。

获取AWStats日志文件

AWStats日志文件一般在 /tmp/ AWStats/

文件名将类似于:

  • awstats062023.higrid.net.txt
  • awstats.higrid.net.conf

我们正在处理的将是具有awstats和文件名中的日期的txt文件。

AWStats统计文件结构

文件的第一行(不是注释)以纯文本形式表示文件的类型。整个文件以纯文本形式工作,因此无需担心二进制或十六进制值。文件类型由“AWSTATS DATA file(主要版本)”标识。(次要版本)(构建(构建号))”。这个标识符很可能被忽略。在我的示例代码中,我只是跳过这一行,寻找部分,它们是整个文件中最重要的部分。

接下来是评论。注释由任何其他字符前面的井号或散列(#)符号标识。我们将跳过所有带有注释的行,并移到下一行。默认情况下,这些日志文件中有很多注释,因此您必须假设它们总是存在。没有注释块,因此解析注释要容易得多。

section以BEGIN_开头,然后在下划线后面加上名称。它们的名称后面有一个空格,表示当前块或部分的END_之前的行数。有一种奇怪的情况,即行计数不正确,并且比行数少一个数字。对于BEGIN_MAP,行数需要增加1。

下面列出了默认情况下放在AWStat文件中的所有节类型。在解析时不应该假定它们的名称,而应该仅在从自己存储的格式获取数据时使用这些名称。每个部分的每行数据用一个空格分隔。如果您查看AWStats文件,它们描述了存储每个部分的顺序。除非您希望使用每个部分,否则不要分割数据,直到最后需要特定部分时才进行分割。

  • MAP: 从文件开始按字节列出所有节的位置。字节通常是不精确的,并且在BEGIN_之前的一行结束。但用这种方法更快速地寻找是可能的。
  • GENERAL: 关于日志文件和站点访问的一般信息。给出AWStats正在解析的日志文件的最后更新、首次访问时间、总访问、唯一访问和位置等信息,这样它就不会一直解析相同的数据并扭曲统计数据。
  • MISC: 显示有关谁支持各种媒体类型(如Java、Flash、RealPlayer等)的各种数据。我发现这些数据不是那么准确,不应该依赖。
  • TIME: 有24行,每一行代表一天中的每一个小时。列出整个月特定时间内的访问量。会给你一个好主意,什么时候最好进行网站更新和发布新帖子或内容的最佳时间。
  • DOMAIN: 列出国家代码以及访问和点击次数。
  • ROBOT: 列出所有访问您网站的机器人。将提供机器人的名称、点击次数、带宽使用情况、上次访问以及它们请求robots.txt文件的次数。
  • WORMS: 列出是否有任何蠕虫或恶意机器人访问过您的网站。将由用户代理确定,有多少次点击,带宽使用情况,以及最后一次访问的时间和日期。
  • FILETYPES: 列出特定文件类型的点击次数(按扩展名)。如果你的网站像WordPress一样使用URL重写,这不会有太大的帮助。显示文件类型,点击和带宽与没有压缩。
  • DOWNLOADS: 列出已下载的文件。显示路径、下载次数、访问量和带宽。
  • OS:列出访问您网站的所有不同操作系统。显示操作系统短名称和点击次数。一些名字的例子是linuxandriod, blackberry, winnt, winxp, win2000, winvista, linux, macosx, winme, win2003, win7, Unknown。
  • BROWSER: 从它的用户代理中对浏览器进行最好的猜测。显示浏览器的短名称和该浏览器的点击次数。 列出无法识别操作系统的用户代理。唯一提供的其他信息是最后一次访问日期。
  • UNKNOWNREFERERBROWSER: 列出找不到浏览器类型而不是操作系统的用户代理。除此之外,与UNKNOWNREFERER相同。
  • SEREFERRALS: 显示搜索引擎的名称,有多少页面和多少点击从搜索引擎。搜索引擎的几个例子名称是谷歌,百度,必应,yandex,雅虎。
  • PAGEREFS: 列出用户访问过您网站的所有外部网页(外部链接引用)。这些URL将不包括参数,这使得很难找到一些访问的真正来源。列出url,页面和点击。
  • SEARCHWORDS: 列出所有的搜索短语(未经编辑),把用户带到你的网站,多少次搜索被执行,并把用户带到网站。谷歌和其他各种搜索引擎从他们的引荐标题中删除搜索词,以保护用户的隐私。但是没有登录或不在HTTPS站点上的用户仍然会在referer header中看到查询。
  • KEYWORDS: 与SEARCHWORDS相同,但不是完整的搜索短语,将列出关键字及其在所有搜索短语中出现的数量。
  • ERROR: 列出HTTP状态码、点击数和带宽。状态200不会出现,但会出现重定向、错误和各种其他状态码。
  • VISITOR: 显示所有访问过您网站的IP地址或“访问者”。列出他们浏览的页面,点击,带宽和最后访问日期。
  • DATE: 列出日期(YYYYMMDD)的页面,点击,带宽和访问。
  • SESSION: 访问站点的访问者的会话范围。显示时间框架以及在此期间停留的会话或访客数量。
  • SIDER: 显示一个网站的URL,页面的数量,带宽,条目和退出从这个页面。很高兴看到用户对什么感兴趣,什么内容让他们开始运行。

现在我们有了一个巨大的节列表,我们最后可以看看如何用一些PHP代码解析这些文件。这段代码很快就被拼凑在一起,不应该在生产环境中使用。此代码用于教育目的,并帮助您创建自己的PHP或其他语言库来解析AWStat文件。

分析AWStats数据的php代码

<?php

/* Sample Setup to test the code */
$histat = new phpAWStats('06','2023','higrid.net','./');
print_r($histat->data);


class phpAWStats {
    private $fh = false;
    public $lastError = false;
    public $data = array();

    function __construct($month,$year,$domain,$path='/tmp/awstats/') {
        $filename = $path.'awstats'.$month.$year.'.'.$domain.'.txt';
        if(!file_exists($filename)) {
            $this->lastError = 'File does not exist.';
            return false;
        }

        $this->fh = fopen($filename,'r');
        if($this->fh === false) {
            $this->lastError = 'File cannot be opened.';
            return false;
        }

        $this->parse();
    }

    /* Checks if line is a comment */
    private function comment($line) {
        if(isset($line[0]) && $line[0] == '#') {
            return true;
        }
        return false;
    }

    /* Builds an array based on a section */
    private function section() {
        $in_section = false;
        $section_name = '';
        $section_lines = 0;
        $on_line = 0;
        $section_content = array();

        if($this->fh === false) {
            return false;
        }

        while(($line = fgets($this->fh)) !== false) {
            $line = trim($line);
            if($this->comment($line)) {
                continue;
            }

            if($in_section) {
                if(strpos($line,'END_'.$section_name) === 0) {
                    return array(
                        'name' => $section_name,
                        'lines' => $section_lines,
                        'content' => $section_content
                    );
                }else if($on_line <= $section_lines) {
                    array_push($section_content,$line);
                    $on_line++;
                    continue;
                }else {
                    $this->lastError = 'Section Can Not Find Ending';
                    return false;
                }
            }

            if(strpos($line,'BEGIN_') === 0) {
                $in_section = true;
                $section_info = explode(' ',$line);
                $section_name = substr($section_info[0],6);
                $section_lines = $section_info[1];
                $on_line = 0;
                $section_content = array();
                continue;
            }
        }
        return false;
    }

    /* Parses the sections array and uses that data for whatever it needs it for */
    private function parse() {
        if($this->fh === false) {
            return false;
        }

        while($section = $this->section()) {
            /*
                Here you would place extra parsing code based on what you want
                to do with the data. But since this is only an example, the
                data is placed into an array with just the section name and
                the data for each line (untouched). Will have to split by [space]
            */
            array_push($this->data,$section);


            /* You can add specific rules based on the section here */
            switch($section['name']) {
                case 'GENERAL':

                    break;
                case 'ROBOT':

                    break;
                /* Add the rest of the section cases */
            }
        }
    }
}

上面的代码将输出AWStats文件中所有数据的一个数组。AWStats每个数组将包含“name”、“lines”和“content”。内容值是另一个数组,每个子数组都是AWStats文件中的行。在parse函数中,可以根据自己的需求设置 PHP解析AWStats日志细分数据 的规则

php处理AWStats日志数据输出结果

如higrid.net某一月访问的访问统计输出结果(部分):

Array
(
    [0] => Array
        (
            [name] => MAP
            [lines] => 28
            [content] => Array
                (
                    [0] => POS_GENERAL 2015
                    [1] => POS_TIME 2703
                    [2] => POS_VISITOR 165161
                    [3] => POS_DAY 323735
                    [4] => POS_DOMAIN 3826
                    [5] => POS_LOGIN 4626
                    [6] => POS_ROBOT 4781
                    [7] => POS_WORMS 6102
                    [8] => POS_EMAILSENDER 6233
                    [9] => POS_EMAILRECEIVER 6376
                    [10] => POS_SESSION 324642
                    [11] => POS_SIDER 324858
                    [12] => POS_FILETYPES 6511
                    [13] => POS_DOWNLOADS 6793
                    [14] => POS_OS 7033
                    [15] => POS_BROWSER 7719
                    [16] => POS_SCREENSIZE 68697
                    [17] => POS_UNKNOWNREFERER 68771
                    [18] => POS_UNKNOWNREFERERBROWSER 70073
                    [19] => POS_ORIGIN 70705
                    [20] => POS_SEREFERRALS 70855
                    [21] => POS_PAGEREFS 71107
                    [22] => POS_SEARCHWORDS 72525
                    [23] => POS_KEYWORDS 72794
                    [24] => POS_MISC 2365
                    [25] => POS_ERRORS 72970
                    [26] => POS_CLUSTER 4482
                    [27] => POS_SIDER_404 73182
                )

        )

    [1] => Array
        (
            [name] => GENERAL
            [lines] => 8
            [content] => Array
                (
                    [0] => LastLine 20230627181459 4911 1190550 6386563133896
                    [1] => FirstTime 20230601000225
                    [2] => LastTime 20230627181459
                    [3] => LastUpdate 20230627193726 4911 0 4911 0 0
                    [4] => TotalVisits 5528
                    [5] => TotalUnique 3652
                    [6] => MonthHostsKnown 0
                    [7] => MonthHostsUnknown 3702
                )

        )

    [2] => Array
        (
            [name] => MISC
            [lines] => 10
            [content] => Array
                (
                    [0] => TotalMisc 0 0 0
                    [1] => JavaEnabled 0 0 0
                    [2] => PDFSupport 0 0 0
                    [3] => DirectorSupport 0 0 0
                    [4] => RealPlayerSupport 0 0 0
                    [5] => QuickTimeSupport 0 0 0
                    [6] => JavascriptDisabled 0 0 0
                    [7] => AddToFavourites 0 421 0
                    [8] => FlashSupport 0 0 0
                    [9] => WindowsMediaPlayerSupport 0 0 0
                )

        )

    [3] => Array
        (
            [name] => TIME
            [lines] => 24
            [content] => Array
                (
                    [0] => 0 1154 1172 15469009 2412 2514 225729104
                    [1] => 1 1474 1486 15791706 2377 2487 172859657
                    [2] => 2 1188 1212 17960683 2291 2352 160183690
                    [3] => 3 1288 1315 18882001 2811 2934 132042106
                    [4] => 4 1258 1290 21981176 2054 2135 111850248
                    [5] => 5 1466 1541 22829161 2437 2650 118433596
                    [6] => 6 1694 1781 82577783 2429 2744 131090941
                    [7] => 7 1272 1377 24610665 2727 2947 133496056
                    [8] => 8 1380 1462 28024432 2614 2771 117317299
                    [9] => 9 1397 1460 38514711 2391 2511 132121819
                    [10] => 10 1283 1358 25327270 4402 4558 393007409
                    [11] => 11 1457 1567 29897511 2239 2467 109868498
                    [12] => 12 1403 1531 31985512 2295 2475 104234704
                    [13] => 13 1465 1598 34709971 2841 3152 124294130
                    [14] => 14 1393 1474 27163184 2945 3098 158283075
                    [15] => 15 1233 1346 24928421 2520 2633 162228663
                    [16] => 16 1243 1323 22880381 2342 2523 164990448
                    [17] => 17 1250 1312 29134112 1928 2421 109073740
                    [18] => 18 1212 1242 22503595 1988 2176 89036893
                    [19] => 19 1260 1329 38102043 2041 2140 84048650
                    [20] => 20 1243 1336 29386330 2004 2098 104561012
                    [21] => 21 1285 1322 37480869 2223 2384 170587522
                    [22] => 22 1174 1210 16850302 3436 3564 259625266
                    [23] => 23 1115 1135 19290404 2285 2358 222287409
                )

        )

    [4] => Array
        (
            [name] => DOMAIN
            [lines] => 38
            [content] => Array
                (
                    [0] => cn 27301 28108 426625042
                    [1] => us 1707 1788 65044724
                    [2] => ip 1502 2162 167744217
                    [3] => se 423 423 362430
                    [4] => kr 155 164 3634575
                    [5] => jp 68 71 753729
                    [6] => de 55 55 2681557
                    [7] => ru 52 54 822697
                    [8] => gb 42 45 379611
                    [9] => be 39 39 511955
                    [10] => ca 34 36 1532538
                    [11] => in 33 36 762068
                    [12] => ar 22 22 134984
                    [13] => hk 21 23 385618
                    [14] => no 18 18 503000
                    [15] => nl 16 16 44374
                    [16] => fr 15 23 704500
                    [17] => id 13 14 666424
                    [18] => ma 11 11 196215
                    [19] => tw 9 12 146396
                    [20] => nz 6 6 131819
                    [21] => sc 5 5 127286
                    [22] => ch 4 4 101850
                    [23] => jo 4 4 387877
                    [24] => vn 3 7 424079
                    [25] => cz 2 2 50925
                    [26] => ro 3 3 55489
                    [27] => ua 2 2 488124
                    [28] => ph 3 7 41254
                    [29] => gr 3 3 76415
                    [30] => au 3 3 130779
                    [31] => dz 2 2 18236
                    [32] => ir 1 1 397913
                    [33] => ci 3 3 76445
                    [34] => md 1 1 25436
                    [35] => it 3 3 55193
                    [36] => es 1 1 4533
                    [37] => il 2 2 50925
                )

        )

    [5] => Array
        (
            [name] => CLUSTER
            [lines] => 0
            [content] => Array
                (
                )

        )

    [6] => Array
        (
            [name] => LOGIN
            [lines] => 0
            [content] => Array
                (
                )

        )

    [7] => Array
        (
            [name] => ROBOT
            [lines] => 29
            [content] => Array
                (
                    [0] => bingbot/ 16120 296194287 20230627181409 172
                    [1] => feed 14371 745644510 20230627181451 23
                    [2] => YandexBot/ 9126 1187246957 20230627174703 112
                    [3] => spider 9113 987659041 20230627175706 282
                    [4] => Googlebot/ 1856 202502996 20230627175957 60
                    [5] => no_user_agent 1346 56037396 20230625013702 0
                    [6] => YisouSpider 1026 32637579 20230627160211 21
                    [7] => netEstate[\x20]NE[\x20]Crawler 1000 128870111 20230610165248 14
                    [8] => Applebot/ 636 7701028 20230627175234 20
                    [9] => unknown 249 13116 20230627173346 249
                    [10] => robot 98 13655029 20230623064652 1
                    [11] => baidu 86 875294 20230627110956 0
                    [12] => Dalvik/ 85 1841694 20230627144850 0
                    [13] => Apache\-HttpClient/ 57 1368241 20230627155403 0
                    [14] => yandex 51 60416 20230627005143 0
                    [15] => bot[\s_+:,\.\;\/\\-] 43 356743 20230623110420 10
                    [16] => Go\-http\-client/ 23 658126 20230626165150 0
                    [17] => Googlebot\-Image/ 23 155308 20230626082407 0
                    [18] => Baiduspider/ 22 444157 20230627033400 0
                    [19] => (firefox/)([0-9]\.|[0-1][0]\.) 13 143244 20230627001854 0
                    [20] => Mail\.RU_Bot/ 8 60670 20230623194140 4
                    [21] => java 6 131609 20230627014909 0
                    [22] => facebookexternalhit/ 3 25436 20230620124130 2
                    [23] => link 3 69205 20230613033742 0
                    [24] => curl 3 34750 20230615092559 0
                    [25] => daum 1 90 20230625062232 1
                    [26] => The[\x20]Knowledge[\x20]AI 2 180 20230604071321 2
                    [27] => MojeekBot 3 270 20230622153213 3
                    [28] => Lightspeed 2 25526 20230615083643 1
                )

版权声明嗨网博客部分文章源自网络收集,不代表嗨网立场,如涉及侵权请联系嗨网删除。
其他若无特别说明则为嗨网原创文章、持续更新。未授权媒体、微信公众号不得使用嗨网内容。 个人自媒体可署名、保留原始链接的情况下转载
转载请注明 来源嗨网higrid.net,链接: https://higrid.net/posts/parsing-awstats-with-php.html
本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除