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 '\n"; echo '\n"; echo "\n"; echo "\n"; echo '\n"; echo "
'; print_login(); echo "

Топ-лист серверов за ' . make_month($year, $month, $day) . "

'; print_imgtop($imgTopCount, 'ajax-imgtop1'); print_imgtop($imgTopData, 'ajax-imgtop2'); echo "
\n"; print_full_line(); /* отобразим таблицу содержащую статистику */ echo "
\n"; if (SESS_TYPE === 'admin') { echo '\n"; } 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 '
'; $endDate = date('t', PERIOD); for ($i = 1; $i <= $endDate; $i++) { if ($i != PERIOD_DAY) { echo '$i "; } else { echo "[$i] "; } } if (PERIOD_DAY) { echo 'все
' . "\n"; print_full_line(); /* отобразим информацию о программе */ print_info($queryCount); print_html_tail(); ?>