Аргерих Л. О языке РНР. Часть 4. Страница 122


if (! (strstr("-", $token_array[2])) and (strlen($token_array[2]) > 1)) { $return_array['UserName'] = $token_array[2];

}

Хорошо было бы отделить дату от времени, потому что пока они хранятся вместе в переменной $token_array[3]. Это делает приведенное регулярное вы­ражение. Оно находит все, что предшествует первому двоеточию и это будет дата. Затем оно находит все до следующего пробела, и это будет время.

Дата и время записываются в $dale_array[1 ] и $date_array[2] соответственно. Потом мы запишем их в нужное место переменной $return_array:

preg_match(7([Va-zA-Z0-9]+)[\: ]([0-9: ]+)/",

$token_array[3],$date_array); $return_array['Oate'] = $return_array['Time'] = $date_array[2];

Нижеприведенные строки помещают остальные данные в возвращаемый массив и возвращают из функции содержимое переменной $return_array:

$return_array['TimeZone'] = $to ken_a r ray[4]; $return_array['RequestMethod'] = $token_array[5]; $return_array['Resource'] = $token_array[6]; $return_array['HTTPVersion'] = $token_array[7]; $return_array['StatusCode'] = $token_array[8]; $return_array['BytesSent'] = $token_array[9]; return $return array;

}

Сценарий анализатора журнала

Теперь напишем остальную часть сценария. В нашем примере мы просто посчитаем количество вхождений кода состояния каждого типа и отправим результат администратору электронной почтой. При желании можно вклю­чить и другую статистику:

<?php

// Выполнять сценарий без ограничения времени

/* •-- Переменные, используемые в сценарии -- .*/

Slogfile = './access.log"; $admin_email = "admin@localhost";

function tokenizeLine(Sline) {

$line = preg_replace("/(\[|\]|\")/", "", $line); $token = strtok($line, " "); while ($token) {

$token_array[] ,= Stoken; =

>

$return_array['IP'] = $token_array[0];

if {! (strstr("-", $token_array[2])) and (strlen($token_array[2]) > 1)) { $return_array['llserName'] = $token_array[2];

}

preg_match("/([ya-zA-Z0-9]+)[\: ]([0-9:]+)/",

$token_array[3],$date_array); =

$return_array['Time'] = $date_array[2]; $return_array['TimeZone'] = $token_array[4];

$return_array['RequestMethod'] = $token_array[5]; $return_array['Resource'] = $token_array[6]; $return_array['HTTPVersion'] = $token_array[7]; $return_array['StatusCode'] = $token_array[8]; $return_array['BytesSent'] = $token_array[9]; return $reiurn_array;

}

Сценарий считывает каждую строку журнала в массив с именем $file_con- tents: