Array (
* [count] => val,
* [data] => val,
* [user] => Array (userIp),
* [userCount] => val
* )
* )
*/
$dataTraf = array();
/*
* Запрос возвращает список удаленных серверов к которым были запросы.
* Различие по протоколу не произодиться.
*/
/* шаблон замены для запроса */
$ptrnTopSrv = array('/%BEGIN_DATE%/', '/%END_DATE%/');
$queryTopSrv = '
select
dstIp as server,
count(*) as count
from
traffic
where
(srcPort = 0) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
group by dstIp';
/* получим данные из базы */
$replacements = array(BEGIN_DATE, END_DATE);
$queryTemp = preg_replace($ptrnTopSrv, $replacements, $queryTopSrv);
$result = my_mysql_query($queryTemp);
while ($line = mysql_fetch_assoc($result)) {
$index = $line['server'];
$dataTraf[$index]['count'] = $line['count'];
}
mysql_free_result($result);
/*
* Сформируем линк для графика суммарной статистики.
*/
/* массив для хранения трафика */
$sumTraf = array();
/* сформируем запрос к базе */
$querySumTraf = 'select case ';
list($year, $month, $day) = split('-', BEGIN_DATE);
$initDate = mktime(0, 0, 0, $month, $day, $year);
list($year, $month, $day) = split('-', END_DATE);
$endDate = mktime(0, 0, 0, $month, $day, $year);
for ($i = 0; $initDate < $endDate; $i++) {
$dateBegin = date("Y-m-d H:i:s", $initDate);
$initDate += PERIOD_DAY ? (60 * 60) : (60 * 60 * 24);
$dateEnd = date("Y-m-d H:i:s", $initDate);
$sumTraf[$i] = 0;
$querySumTraf .= "when (date >= '$dateBegin' && date < '$dateEnd') then $i ";
}
$querySumTraf .= 'end as period, sum(psize) as data from traffic where (dstPort = 0) && (date >= "' .
BEGIN_DATE . '" && date < "' . END_DATE . '") group by period';
/* выполним запрос */
$result = my_mysql_query($querySumTraf);
while ($line = mysql_fetch_assoc($result)) {
$sumTraf[$line['period']] = $line['data'];
}
mysql_free_result($result);
/* сформируем линк картинки */
$imgSumTraf = './graph.php?graph=timegraph&title=' .
urlencode('Incoming traffic (total)') . '&xt=' .
urlencode(PERIOD_DAY ? 'Hours' : 'Days') .
'&data=' . implode(',', $sumTraf);
/*
* Запрос возвращает список хостов запрашивавщих сервер.
*/
$querySrvOfHost = '
select
srcIp
from
traffic
where
(srcPort = 0) && (dstIp = %SERVER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")
group by srcIp';
/*
* Запрос возвращает количество полученного трафика от данного сервера.
*/
$querySrvTraf = '
select
sum(psize) as data
from
traffic
where
(dstPort = 0) && (srcIp = %SERVER%) &&
(date >= "%BEGIN_DATE%" && date < "%END_DATE%")';
$replacements = array(BEGIN_DATE, END_DATE);
$querySrvOfHost = preg_replace($ptrnTopSrv, $replacements, $querySrvOfHost);
$querySrvTraf = preg_replace($ptrnTopSrv, $replacements, $querySrvTraf);
/* получим данные из базы */
foreach ($dataTraf as $server => $data) {
$dataTraf[$server]['data'] = 0;
$queryTemp = preg_replace('/%SERVER%/', $server, $querySrvOfHost);
$result = my_mysql_query($queryTemp);
while ($line = mysql_fetch_assoc($result)) {
$dataTraf[$server]['user'][] = $line['srcIp'];
}
$dataTraf[$server]['userCount'] = count($dataTraf[$server]['user']);
mysql_free_result($result);
$queryTemp = preg_replace('/%SERVER%/', $server, $querySrvTraf);
$result = my_mysql_query($queryTemp);
$line = mysql_fetch_assoc($result);
$dataTraf[$server]['data'] += $line['data'];
mysql_free_result($result);
}
/*
* Функция сортировки данных статистики.
* Перед сортировкой должны быть определены глобальные
* переменные:
* dataTrafCopy - содержит копию сортируемого масива
* sortCmp - ключ в ассоциативном массиве по которому идет сортировка
*/
$dataTrafCopy = $dataTraf;
function sort_cmp($a, $b)
{
global $dataTrafCopy;
global $sortCmp;
$v1 = $dataTrafCopy[$a][$sortCmp];
$v2 = $dataTrafCopy[$b][$sortCmp];
if ($v1 == $v2)
return 0;
return ($v1 > $v2) ? -1 : 1;
}
/*
* Сформируем данные для картинки отображающей топов.
* Внимание, данные можно формировать только после сортировки
* данных.
*/
define('PIE_SLICE', 5);
function make_top_image($title)
{
global $dataTraf;
global $sortCmp;
$topLabel = array();
$topData = array();
$dataTemp = $dataTraf;
$i = 0;
uksort($dataTemp, "sort_cmp");
foreach ($dataTemp as $client => $traf) {
if (!$traf[$sortCmp])
break;
$i++;
if ($i < PIE_SLICE) {
$topLabel[] = long2ip($client);
$topData[] = $traf[$sortCmp];
} else if ($i == PIE_SLICE) {
$topLabel[PIE_SLICE - 1] = urlencode('other');
$topData[PIE_SLICE - 1] = $traf[$sortCmp];
} else {
$topData[PIE_SLICE - 1] += $traf[$sortCmp];
}
}
/* Сформируем линк для картинки топа запросов */
$imgTop = './graph.php?graph=topgraph';
if (isset($topData[0])) {
$imgTop .= '&title=' . urlencode($title) . '&leg=' .
implode('|', $topLabel) . '&data=' . implode(',', $topData);
}
return $imgTop;
}
$sortCmp = 'count';
$imgTopCount = make_top_image('Request');
$sortCmp = 'data';
$imgTopData = make_top_image('Traffic');
/* сортируем данные */
$sortCmp = SORT_CMP;
uksort($dataTraf, "sort_cmp");
/* формирует ссылки для сортировки данных */
function make_sort_link($val, $sort)
{
if ($sort != SORT_CMP) {
$link = '$val";
} else {
$link = $val;
}
return $link;
}
/**
* Отобразим страницу.
*/
list($year, $month) = split('-', BEGIN_DATE);
$day = PERIOD_DAY;
$title = 'Топ-лист серверов за ' . make_month($year, $month, $day);
print_html_head($title, 'reverse_ip');
/* отобразим название продукта */
print_head();
/* отобразим графики содержащие статистику */
echo "
\n";
echo '';
print_login();
echo " |
\n";
echo 'Топ-лист серверов за ' .
make_month($year, $month, $day) . " |
\n";
echo " |
\n";
echo " |
\n";
echo '';
print_imgtop($imgTopCount, 'ajax-imgtop1');
print_imgtop($imgTopData, 'ajax-imgtop2');
echo " |
\n";
echo "
\n";
print_full_line();
/* отобразим таблицу содержащую статистику */
echo "\n";
if (SESS_TYPE === 'admin') {
echo '' .
'' .
'Статистика по месяцам > ' .
'" . make_month($year, $month, $day) .
" > Топ-лист серверов |
\n";
}
echo '';
$endDate = date('t', PERIOD);
for ($i = 1; $i <= $endDate; $i++) {
if ($i != PERIOD_DAY) {
echo '$i ";
} else {
echo "[$i] ";
}
}
if (PERIOD_DAY) {
echo 'все |
\n";
} else {
echo "[все]\n";
}
echo '';
print_data('Номер', 'head0', 'th');
print_data('Сервер', 'head0', 'th');
print_data('Хосты', 'head0', 'th');
print_data(make_sort_link('Запросов', 'count'), 'head1', 'th');
print_data(make_sort_link('Получено', 'data'), 'head1', 'th');
print_data('', 'page');
echo "
\n";
$count = $sumCount = $sumData = $sumUser = 0;
foreach ($dataTraf as $server => $data) {
$count++;
$sumCount += $data['count'];
$sumData += $data['data'];
$sumUser += $data['userCount'];
$serverName = make_span(long2ip($server), 'ajax-reverse_ip');
$users = '';
$i = 0;
foreach ($data['user'] as $val) {
$users .= '' . long2ip($val) . '';
$users .= (++$i % 5) ? ', ' : ',
';
}
$users = preg_replace('/,(\s|
)$/', '', $users);
echo '';
print_data($count, 'data0');
print_data($serverName, 'data1');
print_data($users, 'data1');
print_data(val_trun($data['count']), 'data2');
print_data(val_trun($data['data']), 'data2');
echo "
\n";
}
echo '';
print_data('', 'page');
print_data("Итого:", "head4", "th");
print_data(val_trun($sumUser), 'head3');
print_data(val_trun($sumCount), "head3");
print_data(val_trun($sumData), "head3");
echo '
' . "\n";
echo '
' . "\n";
print_full_line();
/* отобразим информацию о программе */
print_info($queryCount);
print_html_tail();
?>