温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

利用PHP统计Nginx日志的User Agent数据

发布时间:2021-02-04 10:34:22 阅读:183 作者:小新 栏目:开发技术
PHP开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章将为大家详细讲解有关利用PHP统计Nginx日志的User Agent数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

前言

即将用到爬虫,于是打算收集一下User Agent(UA)数据。接着马上想到自己网站的访问日志不就是现成的优质数据源吗?于是愉快的决定写个脚本统计一下Nginx访问日志中的UA信息。

这类简单操作,用脚本语言就足够,毫无疑问肯定要用最熟悉的PHP。打开vim就开撸,十几分钟下来,功能简单的统计脚本就搞定了。

脚本目前有三个功能:

1. 找出所有的UA信息并排序; 2. 统计操作系统数据; 3. 统计浏览器数据。

程序运行截图如下:

1、UA信息

利用PHP统计Nginx日志的User Agent数据

2、操作系统信息

利用PHP统计Nginx日志的User Agent数据

3、浏览器

利用PHP统计Nginx日志的User Agent数据

用脚本统计最近一个月的访问日志,得到以下结果:

  • 搜索引擎爬虫比较频繁,每天有好几千次数据访问;

  • Windows仍是份额最大的操作系统,Linux桌面依然份额很小;

  • Chrome目前是浏览器领域的霸主,其次是Firefox,Opera已经很小众了。

最后附上PHP脚本的代码,也可以从本人的Github里找到:https://github.com/tlanyan/Scripts/blob/master/statUA.php

#!/usr/bin/php
<?php
/**
 * @brief stat UA in access log
 *
 * @author tlanyan<tlanyan@hotmail.com>
 * @link http://tlanyan.me
 */
/* vim: set ts=4; set sw=4; set ss=4; set expandtab; */
function getFileList(string $path) : array {
 return glob(rtrim($path"/") . "/*access.log*");
}
function statFiles(array $files) : array {
 $stat = [];
 echo PHP_EOL, "start to read files...", PHP_EOL;
 foreach ($files as $file) {
  echo "read file: $file ...", PHP_EOL;
  $contents getFileContent($file);
  foreach ($contents as $line) {
   $ua getUA($line);
   if (isset($stat[$ua])) {
    $stat[$ua] += 1;
   } else {
    $stat[$ua] = 1;
   }
  }
 }
 echo "stat all files done!", PHP_EOL, PHP_EOL;
 return $stat;
}
function getFileContent(string $file) : array {
 if (substr($file, -33) === ".gz") {
  return gzfile($file);
 }
 return file($file);
}
function getUA(string $line) : ?string {
 // important! Nginx log format determins the UA location in the line!
 // You may have to refactor following codes to get the right result
 // UA starts from fifth double quote 
 $count 0$offset 0;
 while ($count 5) {
  $pos strpos($line'"'$offset);
  if ($pos === false) {
   echo "Error! Unknown line: $line", PHP_EOL;
   return null;
  }
  $count ++;
  $offset $pos 1;
 }
 $end strpos($line'"'$offset);
 return substr($line$offset$end $offset);
}
function usage({
 echo "Usage: php statUA.php [option] [dir]", PHP_EOL;
 echo " options:", PHP_EOL;
 echo " -h: show this help", PHP_EOL;
 echo " -v: verbose mode", PHP_EOL;
 echo "-n NUM: UA list number", PHP_EOL;
 echo " dir: directory to the log files", PHP_EOL;
 echo PHP_EOL;
}
function filterUA(array$statarray $UAFilters{
 $filterCount 0;
 foreach ($UAFilters as $filter) {
  foreach ($stat as $ua => $count) {
   if (stripos($ua$filter) !== false) {
    $filterCount += $count;
    unset($stat[$ua]);
   }
  }
 }
 echo "filter $filterCount records!", PHP_EOL;
}
function printCount(array $stat{
 $sum array_sum($stat);
 foreach ($stat as $key => $count) {
  echo $key" : "$count", percent: "sprintf("%.2f"100*$count/$sum), PHP_EOL;
 }
}
function statOS(array $UAs) : array {
 global $debug;
 echo PHP_EOL, "stat OS...", PHP_EOL;
 $os = ["Windows""MacOS""Linux""Android""iOS""other"];
 $stat array_fill_keys($os0);
 foreach ($UAs as $key => $count) {
  if (strpos($key"Windows") !== false) {
   $stat["Windows"] += $count;
  } else if (strpos($key"Macintosh") !== false) {
   $stat["MacOS"] += $count;
  // must deal Android first, then Linux
  } else if (strpos($key"Android") !== false) {
   $stat["Android"] += $count;
  } else if (strpos($key"Linux") !== false) {
   $stat["Linux"] += $count;
  } else if (strpos($key"iPhone") !== false || strpos($key"iOS") !== false || strpos($key"like Mac OS") !== false || strpos($key"Darwin") !== false) {
   $stat["iOS"] += $count;
  } else {
   if ($debug) {
    echo "other: $key, count: $count", PHP_EOL;
   }
   $stat["other"] += $count;
  }
 }
 return $stat;
}
function statBrowser(array $UAs) : array {
 global $debug;
 echo PHP_EOL, "stat brwoser...", PHP_EOL;
 $browsers = ["Chrome""Firefox""IE""Safari""Edge""Opera""other"];
 $stat array_fill_keys($browsers0);
 foreach ($UAs as $key => $count) {
  if (strpos($key"MSIE") !== false) {
   $stat["IE"] += $count;
  } else if (strpos($key"Edge") !== false) {
   $stat["Edge"] += $count;
  } else if (strpos($key"Firefox") !== false) {
   $stat["Firefox"] += $count;
  } else if (strpos($key"OPR") !== false) {
   $stat["Opera"] += $count;
  // first Chrome, then Safari
  } else if (strpos($key"Chrome") !== false) {
   $stat["Chrome"] += $count;
  } else if (strpos($key"Safari") !== false) {
   $stat["Safari"] += $count;
  } else {
   if ($debug) {
    echo "other: $key, count: $count", PHP_EOL;
   }
   $stat["other"] += $count;
  }
 }
 return $stat;
}
function parseCmd({
 global $debug$num$path$argc$argv;
 $optind null;
 $options getopt("hvn:", [], $optind);
 if ($argc 2 && empty($options)) {
  usage();
  exit(1);
 }
 if (isset($options['h'])) {
  usage();
  exit(0);
 }
 if (isset($options['v'])) {
  $debug true;
 }
 if (isset($options['n'])) {
  $num intval($options['n']);
  if ($num <= 0) {
   $num 10;
  }
 }
 if ($argc === 2 && empty($options)) {
  $path $argv[1];
 }
 if ($argc $optind) {
  $path $argv[$optind];
 }
 if (!is_dir($path)) {
  echo "invalid directory: $path", PHP_EOL;
  exit(1);
 }
 if ($debug) {
  echo "num: $num", PHP_EOL;
  echo "verbose: "var_export($debugtrue), PHP_EOL;
  echo "path: $path", PHP_EOL;
 }
}
if (version_compare(PHP_VERSION, "7.1") < 0) {
 exit("scripts require PHP >=7.1");
}
$path ".";
$debug false;
$num 10;
$UAFilters = [
 "spider",
 "bot",
 "wget",
 "curl",
];
parseCmd();
$files getFileList($path);
if (empty($files)) {
 echo '"' . realpath($path) . '" does not contain access log files.', PHP_EOL;
 exit(0);
}
$allUA statFiles($files);
if (empty($allUA)) {
 echo "no data", PHP_EOL;
 exit(0);
}
filterUA($allUA$UAFilters);
// sort array with count
uasort($allUA, function ($a$b) {
 return $b $a;
});
if ($debug) {
 print_r($allUA);
}
echo PHP_EOL, "---- top $num UA ----", PHP_EOL;
printCount(array_slice($allUA0$num));
echo "-------------------", PHP_EOL;
$os statOS($allUA);
echo PHP_EOL, "os count:", PHP_EOL;
printCount($os);
$browser statBrowser($allUA);
echo PHP_EOL, "browser count:", PHP_EOL;
printCount($browser);

关于“利用PHP统计Nginx日志的User Agent数据”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×