Skip to content

Instantly share code, notes, and snippets.

@codingfox-rus
Last active December 21, 2018 14:25
Show Gist options
  • Save codingfox-rus/33bb63b8b8a799121d268505b141f82f to your computer and use it in GitHub Desktop.
Save codingfox-rus/33bb63b8b8a799121d268505b141f82f to your computer and use it in GitHub Desktop.
<?php
mb_internal_encoding("UTF-8");
mb_regex_encoding('UTF-8');
$logPath = '';
$dbh = new PDO('mysql:host=localhost;dbname=log', 'root', 'password');
$handle = @fopen($logPath, "r");
if (!$handle) {
exit('Ошибка открытия файла.');
}
$i = 0;
while (/*($i < 1) && */(($line = fgets($handle, 4096)) !== false)) {
$pattern = '^([\d\.\:a-f]+)[^\[]+\[([^\]]+)\]\s+\"([^\"]+)\"\s(\d+)\s(\d+)\s\"([^\"]*)\"\s\"([^\"]*)\"(.*)$';
if (mb_ereg($pattern, $line) !== false) {
echo mb_ereg_replace($pattern, '\\2', $line), PHP_EOL;
// дата
$dt = new DateTime(mb_ereg_replace($pattern, '\\2', $line));
// запрос
$requestString = mb_ereg_replace($pattern, '\\3', $line);
$requestStringParams = explode(' ', $requestString);
if (count($requestStringParams) != 3) {
exit('Неверное количество параметров.');
}
// сохранение
$item = [
'ip' => trim(mb_ereg_replace($pattern, '\\1', $line)),
'date' => $dt->format('Y-m-d H:i:s'),
'method' => $requestStringParams[0],
'url' => $requestStringParams[1],
'protocol' => $requestStringParams[2],
'httpCode' => mb_ereg_replace($pattern, '\\4', $line),
'size' => mb_ereg_replace($pattern, '\\5', $line),
'referrer' => mb_ereg_replace($pattern, '\\6', $line),
'userAgent' => mb_ereg_replace($pattern, '\\7', $line),
'unparsed' => '',
];
dbInsert($dbh, $item);
} else {
echo $line, PHP_EOL;
exit('Некорректный формат строки.');
}
$i++;
}
if (!feof($handle)) {
exit('Ошибка конца файла.');
}
fclose($handle);
function dbInsert(PDO $dbh, $params)
{
try {
$stmt = $dbh->prepare('INSERT INTO `http31` '
. '(`ip`, `date`, `method`, `url`, `protocol`, `httpCode`, `size`, `referrer`, `userAgent`, `unparsed`) '
. 'VALUES (:ip, :date, :method, :url, :protocol, :httpCode, :size, :referrer, :userAgent, :unparsed)');
$stmt->bindParam(':ip', $params['ip']);
$stmt->bindParam(':date', $params['date']);
$stmt->bindParam(':method', $params['method']);
$stmt->bindParam(':url', $params['url']);
$stmt->bindParam(':protocol', $params['protocol']);
$stmt->bindParam(':httpCode', $params['httpCode']);
$stmt->bindParam(':size', $params['size']);
$stmt->bindParam(':referrer', $params['referrer']);
$stmt->bindParam(':userAgent', $params['userAgent']);
$stmt->bindParam(':unparsed', $params['unparsed']);
if (!$stmt->execute()) {
exit('Error insert.');
}
} catch (PDOException $e) {
exit('Error!: ' . $e->getMessage());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment