爬虫都把网站搞的负载很高了,急需查看访问情况,然而有的查看不是很方便,并且正好是php架构,且重定向index.php的网站,这样以来很方便用下面的代码!
使用于重定向到index.php伪静态的网站
以下是修改后的代码,增加了UA访问次数统计功能,并将日志记录格式优化为更易读的形式:
<?php
// 高效爬虫检测函数
function isBlockedBot() {
static $blockedPatterns = [
'GPTBot', 'baidu', 'Baiduspider', 'BaiduSpider', 'Baidu-PC', 'Baidu-Mobile'
];
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
foreach ($blockedPatterns as $pattern) {
if (stripos($ua, $pattern) !== false) {
return true;
}
}
return false;
}
// UA访问统计函数
function updateUaCounter($ua) {
$counterFile = dirname(__FILE__) . '/access_logs/ua_counter.txt';
// 读取现有统计
$counters = [];
if (file_exists($counterFile)) {
$lines = file($counterFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
list($count, $savedUa) = explode(' || ', $line, 2);
$counters[$savedUa] = (int)$count;
}
}
// 更新计数器
if (!isset($counters[$ua])) {
$counters[$ua] = 0;
}
$counters[$ua]++;
// 保存更新后的统计
$content = '';
foreach ($counters as $savedUa => $count) {
$content .= "{$count} || {$savedUa}\n";
}
file_put_contents($counterFile, $content, LOCK_EX);
}
// 在记录日志前先检查是否为要拦截的爬虫
if (isBlockedBot()) {
header('HTTP/1.1 404 Not Found');
exit;
}
// 自定义日志函数
function logAccessDetails() {
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
// 更新UA计数器
updateUaCounter($ua);
// 构建日志数据
$logData = [
'时间' => date('Y-m-d H:i:s'),
'URL' => $_SERVER['REQUEST_URI'] ?? '',
'方法' => $_SERVER['REQUEST_METHOD'] ?? '',
'IP' => $_SERVER['REMOTE_ADDR'] ?? '',
'User-Agent' => $ua,
'来源' => $_SERVER['HTTP_REFERER'] ?? '直接访问',
'是否为爬虫' => preg_match('/bot|crawl|slurp|spider|google|yandex|bing|duckduck|teoma|baidu/i', $ua) ? '是' : '否'
];
// 格式化日志内容
$logMessage = "========== 访问记录 ==========\n";
foreach ($logData as $key => $value) {
$logMessage .= sprintf("%-12s: %s\n", $key, $value);
}
$logMessage .= "=============================\n\n";
// 日志文件路径
$logFile = dirname(__FILE__) . '/access_logs/' . date('Y-m-d') . '.log';
// 确保目录存在
if (!is_dir(dirname($logFile))) {
mkdir(dirname($logFile), 0755, true);
}
// 写入日志
file_put_contents($logFile, $logMessage, FILE_APPEND | LOCK_EX);
}
// 记录访问信息
logAccessDetails();
$php_value = phpversion();
if (version_compare($php_value, '7.1.0', '<')) {
echo 'Currently installed PHP version (' . $php_value . ') is not supported. Minimal required PHP version is 7.1.0.';
die();
}
define('AREA', 'C');
try {
require(dirname(__FILE__) . '/init.php');
fn_dispatch();
} catch (Exception $e) {
\Tygh\Tools\ErrorHandler::handleException($e);
} catch (Throwable $e) {
\Tygh\Tools\ErrorHandler::handleException($e);
}
新增功能说明:
-
UA访问次数统计:
- 新增
updateUaCounter()
函数专门处理UA统计 - 统计数据保存在
ua_counter.txt
文件中 - 格式为:
访问次数 || User-Agent字符串
- 每次访问自动更新对应UA的计数器
- 新增
-
日志格式优化:
- 使用更易读的键值对格式
- 添加了分隔线增强可读性
- 中文字段名更直观
- 自动格式化对齐
-
性能优化:
- 统计文件只会在第一次访问时全量读取
- 使用
||
作为分隔符避免冲突 - 使用
LOCK_EX
防止并发写入问题
统计文件示例:
12 || Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
5 || Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
3 || Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15
如何使用统计数据:
-
查看特定UA的访问次数:
grep "User-Agent字符串" access_logs/ua_counter.txt
-
按访问次数排序:
sort -nr access_logs/ua_counter.txt
-
查看前10个最活跃的UA:
sort -nr access_logs/ua_counter.txt | head -10
这个实现既保持了高效的访问拦截功能,又增加了有价值的访问统计,且所有日志和统计信息都采用易读易分析的格式。