>а чего за скрипты? вот кстати странная фигня, почему досих пор никто
>нормальную морду под это ненаписали, ведь оч удобно было бы пользовать,
>я бы первое что написал бы на пыхпыхе это это, но
>к сожалению моих знаний пыхпыха недостаточно (( Нормальная морда вроде-бы есть, зовется nLog, но мне было интересно самому побаловаться, да и работать этот самый nLog с первого раза у меня не захотел :(
Мои знания в PHP тоже не велики :) там по-большинству на знание запросов.
Например, для удобства я сделал промежуточную табличку, в которую cron`ом каждую ночь сваливаю статистику за предыдущий день, очищая табличку ulog (работать с основной табличкой постоянно тяжко - за день получается около 200-300 тыс. записей, т.к. ulog учитывает каждый пакет).
Дамп таблички:
--
-- Структура таблицы `statistics`
--
CREATE TABLE IF NOT EXISTS `statistics` (
`id` int(11) NOT NULL auto_increment,
`ip_client` text NOT NULL,
`ip_server` text NOT NULL,
`date_timestamp` text NOT NULL,
`traffic` int(11) NOT NULL,
`protocol` text NOT NULL,
`port` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
Скрипт, выполняемый кроном:
#!/usr/bin/php-cgi
<?
$dateStart=date("Y-m-d H:i:s", mktime(0,0,0,date("m"), date("d")-1, date("Y")));
$dateEnd=date("Y-m-d H:i:s");
QUERY ("INSERT INTO `statistics` (ip_client, ip_server, date_timestamp, traffic, protocol, port)
SELECT INET_NTOA( ip_daddr ) AS `ip_client`, INET_NTOA( ip_saddr ) AS `ip_server` ,
CONCAT(SUBSTRING(timestamp, 1, 4), ".", SUBSTRING(`timestamp`, 6, 2), '.', SUBSTRING(`timestamp`, 9, 2))
, SUM( ip_totlen ) as `traffic`, protocol_name, (SELECT IFNULL(tcp_sport, udp_sport))
FROM `ulog`, `protocols`
WHERE
protocol_number=ip_protocol
AND
`timestamp` BETWEEN '".$dateStart."' AND '".$dateEnd."'
GROUP BY `ip_server`, `ip_client`, protocol_name");
QUERY (
"DELETE FROM ulog WHERE `timestamp` BETWEEN '".$dateStart."' AND '".$dateEnd."'");
Запросы мне удобнее выполнять вот такой функцией:
function QUERY($query)
{
$link=mysql_connect("hostname", "username", "password") or die "Unable connect to MySQL Server";
mysql_select_db("ulogd");
$result=mysql_query($query);
mysql_close($link);
return $result;
}
Пример скриптов на работу с табличкой statistics:
<?
$res=QUERY("SELECT DISTINCT ip_client as `client` FROM statistics ORDER BY client");
echo "Общее количество клиентов: <b>".mysql_num_rows($res).'</b>
';
while ($a=mysql_fetch_object($res))
{
print '<a href=details_by_client.php?ip='.$a->client.'>'.$a->client.'</a>
';
}
$res=QUERY("SELECT ip_client, SUM(traffic) as `traffic`
FROM `statistics`
GROUP BY ip_client
");
echo "
Общая информация (За текущий месяц):
";
echo "<table border=1>";
echo "<th>Клиент</th><th>Итого загружено</th>";
while ($a=mysql_fetch_object($res))
{
echo '<tr><td>'.$a->ip_client.'</td><td>'.SHOW_SIZE($a->traffic).'</td></tr>';
}
echo "</table>";
echo '
<b><a href=details.php>Детализация статистики</a></b>';
$date=date("Y.m");
$res=QUERY("SELECT SUM(traffic) as `traffic`
FROM statistics
WHERE SUBSTR(date_timestamp, 1, 7)=".$date."
");
$a=mysql_fetch_object($res);
echo '
Итого за текущий месяц: <b>'.SHOW_SIZE($a->traffic).'</b>
';
$date=date("Y.m", mktime(0,0,0,date("m")-1,1, date("Y")));
$res=QUERY("SELECT SUM(traffic) as `traffic`
FROM statistics
WHERE SUBSTR(date_timestamp, 1, 7)=".$date."
");
$a=mysql_fetch_object($res);
echo '
Итого за предыдущий месяц: <b>'.SHOW_SIZE($a->traffic).'</b>
';
?>
Ну вот в общем то и все. если подробнее - пиши в джаббер\GTalk: vimarakshin(sobaka)gmail.com