The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Детализированный подсчет трафика"
Отправлено Vladimir, 12-Апр-10 05:10 
>а чего за скрипты? вот кстати странная фигня, почему досих пор никто
>нормальную морду под это ненаписали, ведь оч удобно было бы пользовать,
>я бы первое что написал бы на пыхпыхе это это, но
>к сожалению моих знаний пыхпыха недостаточно ((

Нормальная морда вроде-бы есть, зовется 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

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру