校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 利用PHP如何統(tǒng)計Nginx日志的User Agent數(shù)據(jù)

利用PHP如何統(tǒng)計Nginx日志的User Agent數(shù)據(jù)

熱門標簽:銀川ai電話機器人 上海公司外呼系統(tǒng)線路 電梯外呼線路板維修視頻 臨沂智能電銷機器人軟件 地圖標注風(fēng)向標 安陽自動外呼系統(tǒng)價格是多少 芒果電銷機器人 浙江外呼電話系統(tǒng)軟件 十堰ai電話機器人效果怎么樣

前言

即將用到爬蟲,于是打算收集一下User Agent(UA)數(shù)據(jù)。接著馬上想到自己網(wǎng)站的訪問日志不就是現(xiàn)成的優(yōu)質(zhì)數(shù)據(jù)源嗎?于是愉快的決定寫個腳本統(tǒng)計一下Nginx訪問日志中的UA信息。

這類簡單操作,用腳本語言就足夠,毫無疑問肯定要用最熟悉的PHP。打開vim就開擼,十幾分鐘下來,功能簡單的統(tǒng)計腳本就搞定了。

腳本目前有三個功能:

1. 找出所有的UA信息并排序; 2. 統(tǒng)計操作系統(tǒng)數(shù)據(jù); 3. 統(tǒng)計瀏覽器數(shù)據(jù)。

程序運行截圖如下:

1、UA信息

2、操作系統(tǒng)信息

3、瀏覽器

用腳本統(tǒng)計最近一個月的訪問日志,得到以下結(jié)果:

  • 搜索引擎爬蟲比較頻繁,每天有好幾千次數(shù)據(jù)訪問;
  • Windows仍是份額最大的操作系統(tǒng),Linux桌面依然份額很小;
  • Chrome目前是瀏覽器領(lǐng)域的霸主,其次是Firefox,Opera已經(jīng)很小眾了。

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

#!/usr/bin/php
?php
/**
 * @brief stat UA in access log
 *
 * @author tlanyantlanyan@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 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($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);

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 詳解php+nginx 服務(wù)發(fā)生500 502錯誤排查思路
  • 深入分析nginx+php-fpm服務(wù)HTTP狀態(tài)碼502
  • 詳解nginx+php執(zhí)行請求的工作原理
  • php和nginx交互實例講解

標簽:荊門 遂寧 常州 徐州 吐魯番 武威 遵義 寧夏

巨人網(wǎng)絡(luò)通訊聲明:本文標題《利用PHP如何統(tǒng)計Nginx日志的User Agent數(shù)據(jù)》,本文關(guān)鍵詞  利用,PHP,如何,統(tǒng)計,Nginx,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《利用PHP如何統(tǒng)計Nginx日志的User Agent數(shù)據(jù)》相關(guān)的同類信息!
  • 本頁收集關(guān)于利用PHP如何統(tǒng)計Nginx日志的User Agent數(shù)據(jù)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日韩欧美第一区| 成人激情黄色小说| 欧美mv日韩mv国产| 国产剧情一区二区| 一区二区三区精品视频| 日韩午夜电影av| 成人爱爱电影网址| 蜜臀av亚洲一区中文字幕| 国产精品嫩草久久久久| 欧美精品久久久久久久多人混战 | 国产成人在线网站| 国产精品毛片久久久久久| 欧美美女一区二区| 成人永久aaa| 日本亚洲三级在线| 亚洲欧美日韩国产成人精品影院| 91精品综合久久久久久| 成人小视频免费在线观看| 日韩欧美美女一区二区三区| 91免费观看视频| 国产一区在线精品| 日韩主播视频在线| 亚洲欧美日韩精品久久久久| 久久久久国产一区二区三区四区| 欧美日韩大陆一区二区| 97se亚洲国产综合自在线观| 狠狠狠色丁香婷婷综合激情 | 激情综合色综合久久| 亚洲国产美女搞黄色| 国产精品每日更新| 国产日韩欧美亚洲| 精品精品国产高清a毛片牛牛| 欧美日韩中文一区| 成人国产视频在线观看| 国产最新精品免费| 久久精品国内一区二区三区| 丝袜亚洲另类欧美| 亚洲一二三四在线观看| 亚洲欧洲综合另类| 国产精品成人一区二区艾草| 国产欧美一区二区三区鸳鸯浴 | 色又黄又爽网站www久久| 国产精品888| 国产一区二区不卡在线| 日本 国产 欧美色综合| 日韩在线观看一区二区| 午夜精品影院在线观看| 亚洲午夜日本在线观看| 亚洲最大的成人av| 亚洲国产乱码最新视频 | 亚洲成人免费观看| 亚洲成精国产精品女| 亚洲五月六月丁香激情| 一区二区三区**美女毛片| 亚洲图片激情小说| 亚洲免费视频中文字幕| 亚洲欧美激情小说另类| 一区二区三区日韩| 亚洲高清免费观看高清完整版在线观看| 一区二区三区影院| 一区二区三区精品在线| 午夜电影久久久| 亚洲va中文字幕| 亚洲成av人片在线观看无码| 午夜日韩在线观看| 久久精品国产**网站演员| 久久97超碰色| 国产91丝袜在线播放| 99视频在线精品| 色综合久久88色综合天天免费| 色88888久久久久久影院按摩| 久久午夜老司机| 欧美激情一区二区三区在线| 中文字幕免费不卡| 亚洲人成亚洲人成在线观看图片 | 国产麻豆视频一区二区| 高清不卡一区二区在线| 99精品偷自拍| 欧美日韩高清一区二区三区| 精品国产一区二区三区不卡| 国产精品欧美一级免费| 亚洲免费观看高清完整版在线| 亚洲一区二区三区在线| 蜜臀av一区二区三区| 国产成人免费在线观看| 91免费国产在线| 91精品免费观看| 久久久www免费人成精品| 中文字幕一区二区在线播放| 亚洲一区二区免费视频| 美日韩黄色大片| 成人在线综合网| 日本高清不卡一区| 日韩美女一区二区三区四区| 国产精品久久久久久久久搜平片 | 五月综合激情日本mⅴ| 国内一区二区在线| 99视频精品免费视频| 在线观看国产日韩| 欧美精品一区二区三区高清aⅴ| 国产欧美日产一区| 亚洲电影第三页| 国产.精品.日韩.另类.中文.在线.播放| 欧洲色大大久久| 精品成人在线观看| 亚洲欧美日韩国产一区二区三区| 日本va欧美va瓶| 色偷偷成人一区二区三区91| 日韩精品一区二区三区视频播放| 中文字幕中文字幕一区| 日韩和欧美一区二区三区| 盗摄精品av一区二区三区| 亚洲视频图片小说| 精品在线播放免费| 在线看日韩精品电影| 久久久噜噜噜久噜久久综合| 亚洲午夜久久久久久久久久久| 国产一区二区三区日韩| 欧美日韩免费视频| 欧美高清在线精品一区| 日本美女一区二区三区视频| www.亚洲人| 精品人伦一区二区色婷婷| 亚洲精品视频在线观看网站| 国产一区二区女| 欧美肥妇毛茸茸| 亚洲欧美成人一区二区三区| 国产精品888| 欧美色图免费看| 日韩一区中文字幕| 国产精华液一区二区三区| 欧美乱熟臀69xxxxxx| 国产精品久99| 国产91在线观看| 久久久久久久久久电影| 琪琪一区二区三区| 欧美图片一区二区三区| 国产精品国产三级国产aⅴ原创 | 在线中文字幕一区| 中文字幕免费观看一区| 国产乱对白刺激视频不卡| 日韩一级欧美一级| 香蕉久久一区二区不卡无毒影院| av一二三不卡影片| 日本一区二区三区在线不卡| 色一情一伦一子一伦一区| 久久综合精品国产一区二区三区 | 欧美精品xxxxbbbb| 亚洲欧美国产77777| 色诱亚洲精品久久久久久| 一区二区三区在线观看视频| 88在线观看91蜜桃国自产| 爽爽淫人综合网网站| av亚洲精华国产精华| av电影在线观看不卡 | 精品在线视频一区| 日韩午夜小视频| 丝袜诱惑亚洲看片| 欧美三级日韩三级| 亚洲综合视频网| 在线免费观看成人短视频| 一区二区三区欧美| 欧美亚洲国产一卡| 亚洲综合色噜噜狠狠| 日本高清不卡aⅴ免费网站| 亚洲免费av高清| 在线观看网站黄不卡| 亚洲久草在线视频| 色综合天天做天天爱| 欧美tk丨vk视频| 日韩国产一区二| 3d动漫精品啪啪1区2区免费| 视频一区二区欧美| 91精品久久久久久蜜臀| 人人爽香蕉精品| www国产亚洲精品久久麻豆| 国产一区二区三区视频在线播放| 国产日本欧美一区二区| 91视频91自| 亚洲成人动漫在线免费观看| 欧美一区二区三区人| 韩国一区二区在线观看| 国产色爱av资源综合区| 成人ar影院免费观看视频| 亚洲欧洲精品天堂一级| 在线观看国产日韩| 蜜桃精品视频在线观看| www精品美女久久久tv| aa级大片欧美| 亚洲高清免费一级二级三级| 欧美一二区视频| 国产成人免费视频一区| 亚洲欧美偷拍另类a∨色屁股| 精品视频在线视频| 美女视频一区在线观看| 欧美—级在线免费片| 欧美色爱综合网| 国产在线精品一区二区三区不卡 | 日韩中文字幕1| 久久精品人人做人人综合|