亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

利用PHP如何統計Nginx日志的User Agent數據

2024-05-05 00:07:11
字體:
來源:轉載
供稿:網友

前言

即將用到爬蟲,于是打算收集一下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, -3, 3) === ".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& $stat, array $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($os, 0); 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($browsers, 0); 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($debug, true), 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 countuasort($allUA, function ($a, $b) { return $b - $a;});if ($debug) { print_r($allUA);}echo PHP_EOL, "---- top $num UA ----", PHP_EOL;printCount(array_slice($allUA, 0, $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);

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久夜色精品国产| 久久天天躁狠狠躁夜夜爽蜜月| 在线播放日韩欧美| 日韩在线观看免费高清完整版| 热门国产精品亚洲第一区在线| 欧美在线国产精品| 国产精品黄视频| 午夜精品久久久久久久99黑人| 亚洲男人天堂古典| 国产成人精品视频在线| 黄色精品一区二区| 欧美理论电影网| 九九视频这里只有精品| 亚洲欧美中文在线视频| 亚洲欧美日韩网| 国产精品日韩在线观看| 亚洲免费视频在线观看| 欧美大片欧美激情性色a∨久久| 中文字幕欧美国内| 欧美精品18videosex性欧美| 日韩视频第一页| 国产做受高潮69| 久久精品人人做人人爽| 69视频在线免费观看| 三级精品视频久久久久| 国内偷自视频区视频综合| 国产精品视频一区二区高潮| 欧美亚州一区二区三区| 97香蕉超级碰碰久久免费的优势| 欧美www在线| 日韩av电影国产| 成人精品视频99在线观看免费| 亚洲白拍色综合图区| 久久久久北条麻妃免费看| 国产精品www网站| 欧美精品日韩三级| 这里只有精品在线观看| 国产一区二区三区在线免费观看| 日韩一区视频在线| 国产z一区二区三区| 中文字幕久热精品视频在线| 精品久久久免费| 午夜精品久久久久久久久久久久久| 欧美视频中文字幕在线| 亚洲国产精品推荐| 国产日韩在线观看av| 亚洲精品乱码久久久久久按摩观| 在线视频亚洲欧美| 国产精品成人一区| 日韩av一区在线| 欧美性生交大片免费| 欧美精品激情视频| 一级做a爰片久久毛片美女图片| 亚洲欧美激情视频| 色综合伊人色综合网站| 国产精品极品美女粉嫩高清在线| 26uuu亚洲伊人春色| 欧美成人在线网站| 国产精品美女免费视频| 国产精品久久久久久久久久久新郎| 国产精品成人一区二区三区吃奶| 久久久久久久久久久91| 久久九九亚洲综合| 亚洲欧美中文另类| 亚洲人成电影网站色xx| 欧美日韩裸体免费视频| 日韩在线视频免费观看| 国产精品激情自拍| 欧美激情免费看| 久久久中精品2020中文| 日韩欧美中文字幕在线播放| 疯狂欧美牲乱大交777| 国产高清在线不卡| 欧美国产欧美亚洲国产日韩mv天天看完整| 国内精品小视频在线观看| 91中文精品字幕在线视频| 日韩人在线观看| 欧美另类在线观看| 91亚洲一区精品| 国模视频一区二区三区| 久久这里有精品视频| 国产精品激情自拍| 91国产视频在线播放| 91干在线观看| 亚洲女人天堂色在线7777| 亚洲一区二区福利| 欧美激情图片区| 91国产中文字幕| 欧美日韩一区二区三区| 日韩第一页在线| 久久久久久久999精品视频| 亚洲激情第一页| 91最新在线免费观看| 日韩有码在线播放| 精品夜色国产国偷在线| 黑人巨大精品欧美一区二区| 成人亚洲综合色就1024| 亚洲精品成人av| 亚洲人午夜色婷婷| 国语自产精品视频在线看抢先版图片| 国产欧美日韩精品专区| 中文字幕日韩欧美精品在线观看| 久久99精品久久久久久噜噜| 亚洲成人黄色在线| 青青青国产精品一区二区| 色妞在线综合亚洲欧美| 综合激情国产一区| 久久久亚洲欧洲日产国码aⅴ| 97在线精品国自产拍中文| 97超级碰碰碰| 最近2019中文字幕在线高清| 成人福利网站在线观看11| 日韩精品中文字幕在线观看| 成人在线视频网| 久久亚洲国产成人| 日本成人黄色片| 69av在线视频| 国产97色在线|日韩| 亚洲男人av在线| 97碰在线观看| 国产精品日韩在线播放| 中文字幕v亚洲ⅴv天堂| 最近2019中文字幕mv免费看| 亚洲欧美日韩精品久久亚洲区| 亚洲综合自拍一区| 色悠悠久久88| 国产免费成人av| 欧美xxxx做受欧美.88| 国产欧美 在线欧美| 欧美成人精品不卡视频在线观看| 国产91免费看片| 欧美性xxxx在线播放| 国产精品99蜜臀久久不卡二区| 欧美亚洲另类制服自拍| 97色伦亚洲国产| 亚洲无线码在线一区观看| 欧美高清一级大片| 久久久999国产精品| 最近中文字幕mv在线一区二区三区四区| 久久亚洲综合国产精品99麻豆精品福利| 日韩免费不卡av| 最近2019年好看中文字幕视频| 色综合亚洲精品激情狠狠| 国产精自产拍久久久久久| 亚洲区中文字幕| 一区二区三区四区视频| 精品激情国产视频| 亚洲视频视频在线| 欧美成年人视频网站欧美| 日产日韩在线亚洲欧美| 欧美日本高清一区| 日韩中文av在线| 国产精品久久久久久久久久久新郎| 日本久久久久久久久久久| 精品日韩美女的视频高清| 91黑丝在线观看| 欧美在线视频一区| 国产一区视频在线播放| 久久大大胆人体| 久久久久久久久久久人体| 亚洲福利精品在线| xxxx欧美18另类的高清| 亚洲夜晚福利在线观看| 91av福利视频|