Профессиональное программирование на PHP

Страница 130 из 591


Разбор аргументов командной строки 135

<?РНР

$counts = array('ip1 => array(), 1user_agent' => array()); while(($line = fgets(STDIN)) != false) {

# Данное регулярное выражение позволяет поле за

# полем сверять форматированную строку журнала.

$regex = '/"(\S+) (\S + ) (\S + ) \ [ ( Г : ]+) : (\d+:\d+:\d+) (Г\]]+)\] '"(\S+) (.*?) (\S+)" (\S+) (\S+) "(Г"]*)" "([""]*)"$/' preg_match($regex,$line,$matches);

list(, $ip, $ident_name, $remote_user, $date, $time, $gmt_off, $method, $url, $protocol, $code, $bytes, $referrer, $user_agent) = $matches;

$counts['ip']["$ip"]++;

$counts['user_agent1]["$user_agent"]++;

# Печатать 1.1 в STDERR через каждую тысячу обработанных строк, if(($lineno++ % 1000) == 0) {

fwrite(STDERR, ".");

}

}

arsort({counts ['ip1] , SORT_NUMERIC); reset($counts ['ip1]);

arsort({counts['user_agent'], SORT_NUMERIC); reset($counts[1user_agent1]);

foreach(array(1ip1, 1user_agent1) as $field) { $i = 0;

print "Максимальное количество запросов no $field\n";

print "--------------------------------\n" ;

foreach({counts[$field] as $k => $v) { print "$v\t\t$k\n"; if($i++ == 10) { break;

}

}

print "\n\n";

}

?>

Сценарий работает, считывая log-файл в STDIN и сверяя каждую строку с $гедех для извлечения отдельных полей. Затем подсчитываете я суммарная статистика, количество запросов на уникальный IP-адрес и для каждого уникального браузера. Поскольку log-файлы комбинированного формата велики, можно отправлять в stderr точку (.) через каждую тысячу строк, чтобы отразить ход выполнения разбора. Если вывод сценария перенаправляется в файл, то в данном файле появится только окончание отчета, а точки будут появляться только на пользовательском экране.

Разбор аргументов командной строки

Когда PHP-сценарий запускается из командной строки, невозможно передать ему аргументы через переменные $_GET и $_POST (CLI-интерфейс "не имеет понятия" об этих Web-протоколах). Вместо этого аргументы передаются в командную строку. Аргументы командной строки можно считывать необработанными из автоглобальной переменной $argv.




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006