pbootcms和eyoucms引入蜘蛛抓取插件
eyoucms更改index.php文件,新增:

// 加载蜘蛛抓取文件 require __DIR__ . '/core/spider_logger.php';
pbootcms更改index.php,新增:

// 引入蜘蛛记录文件(按周存储) require dirname(__FILE__) . '/core/spider_logger.php';
spider_logger.php文件内容如下:
<?php
/**
* 严格行分隔的JSON日志记录器(域名+日期格式版)
* 每行一个完整JSON记录,无换行符干扰
* 记录完整请求URL
*/
// ============== 配置区 ==============
define('LOG_DIR', __DIR__ . '/data/access_logs/');
define('LOG_DATE_FORMAT', 'Y-m-d'); // 按日分割
define('MAX_LINE_LENGTH', 1024); // 单行最大长度限制
// ==================================
// 自动初始化日志目录
if (!file_exists(LOG_DIR)) {
mkdir(LOG_DIR, 0755, true);
file_put_contents(LOG_DIR . 'index.html', ''); // 防止目录列表
}
/**
* 获取当前域名(用于日志文件名)
*/
function getCurrentDomain() {
$host = $_SERVER['HTTP_HOST'] ?? 'unknown';
// 去除端口号
return preg_replace('/:\d+$/', '', strtolower($host));
}
/**
* 获取当前日志文件路径
*/
function getLogFile() {
$domain = getCurrentDomain();
$filename = LOG_DIR . $domain . '_access_' . date(LOG_DATE_FORMAT) . '.log';
// 首次创建时添加UTF-8 BOM头(解决编码问题)
if (!file_exists($filename)) {
file_put_contents($filename, "\xEF\xBB\xBF");
}
return $filename;
}
/**
* 获取完整请求URL
*/
function getFullRequestUrl() {
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
$host = $_SERVER['HTTP_HOST'] ?? 'unknown';
$uri = $_SERVER['REQUEST_URI'] ?? '';
return $protocol . $host . $uri;
}
/**
* 操作系统检测
*/
function detectOS($ua) {
if (empty($ua)) return 'Unknown';
$patterns = [
'/windows nt 10/i' => 'Windows 10',
'/windows nt 6.3/i' => 'Windows 8.1',
'/windows nt 6.2/i' => 'Windows 8',
'/windows nt 6.1/i' => 'Windows 7',
'/windows nt 6.0/i' => 'Windows Vista',
'/windows nt 5.1/i' => 'Windows XP',
'/macintosh|mac os x/i' => 'Mac OS X',
'/linux/i' => 'Linux',
'/ubuntu/i' => 'Ubuntu',
'/android/i' => 'Android',
'/iphone|ipad|ios/i' => 'iOS',
'/cros/i' => 'Chrome OS'
];
foreach ($patterns as $regex => $os) {
if (preg_match($regex, $ua)) return $os;
}
return 'Unknown';
}
/**
* 浏览器检测
*/
function detectBrowser($ua) {
if (empty($ua)) return 'Unknown';
$patterns = [
'/msie|trident/i' => 'Internet Explorer',
'/edg/i' => 'Edge',
'/chrome/i' => 'Chrome',
'/firefox|fxios/i' => 'Firefox',
'/safari/i' => 'Safari',
'/opera|opr/i' => 'Opera',
'/yabrowser/i' => 'Yandex',
'/ucbrowser/i' => 'UC Browser',
'/micromessenger/i' => 'WeChat',
'/qqbrowser/i' => 'QQ Browser',
'/baidubrowser/i' => 'Baidu Browser'
];
foreach ($patterns as $regex => $browser) {
if (preg_match($regex, $ua)) return $browser;
}
return 'Unknown';
}
/**
* 严格单行JSON记录
*/
function writeLogLine(array $data) {
$json = json_encode($data,
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PARTIAL_OUTPUT_ON_ERROR
);
// 防御性处理:确保最终是单行
$cleanJson = str_replace(["\r", "\n"], '', $json);
$logLine = substr($cleanJson, 0, MAX_LINE_LENGTH) . PHP_EOL;
file_put_contents(getLogFile(), $logLine, FILE_APPEND | LOCK_EX);
}
/**
* 主记录逻辑
*/
function logAccess() {
try {
$logData = [
'time' => date('Y-m-d H:i:s.v'), // 含毫秒
'ip' => $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0',
'method' => $_SERVER['REQUEST_METHOD'] ?? 'NULL',
'status' => http_response_code(),
'url' => getFullRequestUrl(), // 完整URL(包含协议、域名和路径)
'ua' => isset($_SERVER['HTTP_USER_AGENT'])
? substr($_SERVER['HTTP_USER_AGENT'], 0, 500)
: 'NULL',
'os' => detectOS($_SERVER['HTTP_USER_AGENT'] ?? ''),
'browser' => detectBrowser($_SERVER['HTTP_USER_AGENT'] ?? '')
];
writeLogLine($logData);
} catch (Exception $e) {
// 静默失败,不影响主流程
}
}
// 自动注册记录器
if (php_sapi_name() !== 'cli' && !defined('DISABLE_ACCESS_LOG')) {
register_shutdown_function('logAccess');
}另外三个版本自行参考:
