日志升级与缓存修复最终版
This commit is contained in:
@@ -50,6 +50,9 @@ class VisitorLogWorker
|
||||
if ($type === 'enrich') {
|
||||
return self::enrich((int) ($job['log_id'] ?? 0), $job['logs'] ?? []);
|
||||
}
|
||||
if ($type === 'update') {
|
||||
return self::updateFromLogs((int) ($job['log_id'] ?? 0), $job['logs'] ?? []);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -208,6 +211,82 @@ class VisitorLogWorker
|
||||
return $ok;
|
||||
}
|
||||
|
||||
/**
|
||||
* 续步 UPDATE:合并同一次 visit 内的日志字段(不修改 vtimes)。
|
||||
*
|
||||
* @param int $logId
|
||||
* @param array $logs
|
||||
*/
|
||||
public static function updateFromLogs($logId, array $logs)
|
||||
{
|
||||
$logId = (int) $logId;
|
||||
if ($logId <= 0) {
|
||||
return false;
|
||||
}
|
||||
$conn = self::connect();
|
||||
if (!$conn) {
|
||||
return false;
|
||||
}
|
||||
VisitorLogSchema::ensureColumns($conn);
|
||||
|
||||
$data = self::escapeLogs($conn, $logs);
|
||||
$sets = [];
|
||||
$map = [
|
||||
'country' => 'country',
|
||||
'referer' => 'v_referer',
|
||||
'client' => 'Client',
|
||||
'browser' => 'v_Browser',
|
||||
'page' => 'v_PageURL',
|
||||
'language' => 'accept_language',
|
||||
'user_agent' => 'user_agent',
|
||||
'http_referer' => 'http_referer',
|
||||
'accept_language_raw' => 'accept_language_raw',
|
||||
'judge_timing' => 'judge_timing',
|
||||
'fp_url' => 'fp_url',
|
||||
'device' => 'device',
|
||||
'api_by_request' => 'api_by_request',
|
||||
'api_by_response' => 'api_by_response',
|
||||
'api_risk_request' => 'api_risk_request',
|
||||
'api_risk_response' => 'api_risk_response',
|
||||
];
|
||||
foreach (['result', 'reason', 'fp_url'] as $col) {
|
||||
if (array_key_exists($col, $logs)) {
|
||||
$key = array_key_exists($col, $data) ? $col : $col;
|
||||
$logKey = $col === 'fp_url' ? 'fp_url' : $col;
|
||||
$val = array_key_exists($logKey, $data) ? $data[$logKey] : cloak_db_escape($conn, $logs[$col]);
|
||||
$sets[] = "`{$col}`='" . $val . "'";
|
||||
}
|
||||
}
|
||||
foreach ($map as $col => $logKey) {
|
||||
if (!array_key_exists($logKey, $data)) {
|
||||
continue;
|
||||
}
|
||||
if ((string) $data[$logKey] === '') {
|
||||
continue;
|
||||
}
|
||||
$sets[] = "`{$col}`='" . $data[$logKey] . "'";
|
||||
}
|
||||
foreach (['fp_hdata', 'api_risk_request', 'api_risk_response'] as $col) {
|
||||
if (!array_key_exists($col, $logs)) {
|
||||
continue;
|
||||
}
|
||||
$val = array_key_exists($col, $data) ? $data[$col] : cloak_db_escape($conn, $logs[$col]);
|
||||
$sets[] = "`{$col}`='" . $val . "'";
|
||||
}
|
||||
if ($sets === []) {
|
||||
$conn->close();
|
||||
return true;
|
||||
}
|
||||
|
||||
$sql = 'UPDATE `visitor_logs` SET ' . implode(', ', array_unique($sets)) . ' WHERE `id`=' . $logId;
|
||||
$ok = $conn->query($sql) === true;
|
||||
if (!$ok) {
|
||||
VisitorLogQueue::logError('updateFromLogs: ' . $conn->error);
|
||||
}
|
||||
$conn->close();
|
||||
return $ok;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mysqli $conn
|
||||
* @param array $logs
|
||||
|
||||
Reference in New Issue
Block a user