Jump to content

Отдельный сервер для "детальной статистики"


Recommended Posts

Значит решение почту готово, только вот столкнулся с выводом результата.

 

Данные заносятся в mysql и непосредственно с консоли выводятся в нужном для меня виде (скриншот)

 

Пытаюсь сделать, чтобы результат выводился через вебморду. Все это состоит из двух страниц в первой: Сбор данных, ip, период времени (даты). :

 

<html>
    <head>
        <meta charset="utf8">
        <title>Страница статистики</title>
    </head>
        <body style="background-color: #83C5E9">
        <h1><p align="center">Статистика по трафику абонента</p></h1>
        <h3><p align="center">Введите необходимые данные</p></h3>
            <form align="center" action="request.php" method="post">
            <h4><p align="center">За какой год</p></h4>
            <h6><p align="center">(нужно для корректной генерации запроса sql)</p></h6>
            <center><select required name="year"></center>
            <option value="2016">2016</option>
            <option value="2017">2017</option>
            <option value="2018">2018</option>
            <option value="2019">2019</option>
            </select>
            <h4><p align="center">Выгрузить с</p></h4>
            <h5><p align="center">Формат даты: ГГГГ-ММ-ДД (2015-12-25)</p></h5>
            <center><input align="center" name="date-start" size="43" type="date" min="2016-01-01" max="2110-01-01"/></center>
            <h4><p align="center">Выгрузить по</p></h4>
            <h5><p align="center">Формат даты: ГГГГ-ММ-ДД (2015-12-25)</p></h5>
            <center><input align="center" name="date-end" size="43" type="date" min="2016-01-01" max="2110-01-01"/></center>
            <h4><p align="center">IP адрес пользователя</p></h4>
            <center><input align="center" name="ipadd" size="43" type="text"/></center>
            <center><input type="submit" value="Выгрузить" /></center>
            </form>
        </body>
</html>

 

(вот код)

 

А вот сама страница вывода результата:

 

<?php
//Получаем переменные из формы запроса
//Начало периода
$startdate = $_POST['date-start'];
//Конец периода
$enddate = $_POST['date-end'];
//Ip адрес юзера
$ip = $_POST['ipadd'];
//За какой год
$year = $_POST['year'];
//Данные для подключения к БД
$db_user= 'точно правильный user';
$db_host= 'реальный айпи';
$db_pass = 'пароль';
$db_base = 'имя базы';

//Пробуем подключится к БД
$link = mysqli_connect("$db_host","$db_user","$db_pass", "$db_base");
$link->set_charset("latin1");
if($link->connect_errno):
        die($link->connect_error);
endif;
$sql =$link->query("SELECT from_IP, date, SUM(bytes) AS 'bytes' FROM igb1_$year WHERE from_IP = '$ip' and DATE BETWEEN '$startdate' AND 'enddate' GROUP by DATE ORDER by date");
    while($result=$sql->fetch_row()):
            print "$result[from_IP] | $result[date]  |  $result[bytes]<br>";
    endwhile;
?>

 

 

После обработки запроса, ничего не выдает, ни ошибки не данных. Просто белая страница) В чем может быть проблема? Версия mysql 5.6. версия php - 5.3.28

post-39008-0-82537500-1460927356_thumb.png

Edited by Golthana
Link to post
Share on other sites

Все. Решение найдено. Вставил таблицу в код и вместо mysqli использовал mysql (ну это роль не играет в моем случае) Всем спасибо.

Edited by Golthana
Link to post
Share on other sites
  • 6 months later...

Переделал модуль детальной статистики, принцип работы тот же, только данные берет из уделенной БД. Если кому надо, пишите.

Link to post
Share on other sites
  On 10/20/2016 at 6:48 PM, Golthana said:

Переделал модуль детальной статистики, принцип работы тот же, только данные берет из уделенной БД. Если кому надо, пишите.

Вы не поведаете что с этой важнейшей подробной жизненной историей незнакомых людей потом можно делать ?

Link to post
Share on other sites
  On 10/20/2016 at 6:48 PM, Golthana said:

Переделал модуль детальной статистики, принцип работы тот же, только данные берет из уделенной БД. Если кому надо, пишите.

 

Выкладывайте, кому надо - возьмет

Link to post
Share on other sites
  On 10/20/2016 at 11:05 PM, zaza12 said:
Вы не поведаете что с этой важнейшей подробной жизненной историей незнакомых людей потом можно делать ?

 

Я уже писал. У нас предусмотрен перерасчет средств, если у человека не работает или очень криво работал интернет. Вот она и нужна разобраться. 

 

Доберусь до работы и выложу.

Edited by Golthana
Link to post
Share on other sites
<?php

 

if (cfr('PLDETAILS')) {

 

 

if (isset($_GET['username'])) {

ini_set("memory_limit", "512M");

include '/usr/local/stat/config.php';

$user = $_GET['username'];

        $userdata = zb_UserGetStargazerData($user);

$login=$userdata['IP'];

 

//query for global stat

 

function web_DSShow($user) {

global $login;

include '/usr/local/stat/config.php';

$gstat_query="SELECT DATE_FORMAT(stamp_inserted, '%Y-%m-%d') as day, ip_src, SUM(bytes) as bytes from acct where ip_src='" . $login . "' group by day";

$gstat=mysqli_query($connect,$gstat_query);

$gl_stat=array();

$cells = wf_TableCell(__('Day'));

$cells.= wf_TableCell(__('Downloaded'));

$rows = wf_TableRow($cells, 'row1');

while ($gstat_q=mysqli_fetch_assoc($gstat)) {

$gl_stat[]=$gstat_q;

}

if (!empty($gl_stat)) {

foreach ($gl_stat as $io => $eachstat) {

$dayLink = wf_Link('?module=pl_traffdetails&username=' . $user . '&day=' . $eachstat['day'], $eachstat['day']);

$cells = wf_TableCell($dayLink);

$cells.= wf_TableCell(stg_convert_size($eachstat['bytes']), '', '', 'sorttable_customkey="' . $eachstat['bytes'] . '"');

$rows.= wf_TableRow($cells, 'row3');

 

}

}  

$result=wf_TableBody($rows, '100%', 0, 'sortable');

return($result);

}

 

//For daily statistic

function web_DSShowDayStats($user, $day, $page = 0) {

global $login;

include '/usr/local/stat/config.php';

$page = vf($page);

$day = $_GET['day'];

//$day = vf($day);

$result='';

$det_stat=array();

$det_stat_query="SELECT stamp_inserted as startTime, stamp_updated as endTime, ip_dst as IP, dst_port as port, ip_proto, bytes FROM acct WHERE ip_src='" . $login . "' and stamp_inserted like '$day%'";

$det_stat_raw=mysqli_query($connect,$det_stat_query);

$cells = wf_TableCell(__('Session start'));

             $cells.= wf_TableCell(__('Session end'));

             $cells.= wf_TableCell(__('IP'));

$cells.= wf_TableCell(__('port'));

$cells.= wf_TableCell(__('protocol'));

$cells.= wf_TableCell(__('Downloaded'));

$rows = wf_TableRow($cells, 'row1');

if (empty($det_stat_raw)) {

echo($login);

echo($day);

}

while ($det_stat_q=mysqli_fetch_assoc($det_stat_raw)) {

$det_stat[]=$det_stat_q;

}

if (!empty($det_stat)) {

foreach ($det_stat as $io => $eachtraff) {

$cells = wf_TableCell($eachtraff['startTime']);

$cells.= wf_TableCell($eachtraff['endTime']);

$whoisLink = wf_Link('?module=whois&ip=' . $eachtraff['IP'], wf_img('skins/icon_whois_small.png', __('Whois')));

$webLink = wf_Link('http://' . $eachtraff['IP'], $eachtraff['IP']);

$cells.= wf_TableCell($whoisLink . ' ' . $webLink);

$cells.= wf_TableCell($eachtraff['port']);

$cells.= wf_TableCell($eachtraff['ip_proto']);

$cells.= wf_TableCell(stg_convert_size($eachtraff['bytes']), '', '', 'sorttable_customkey="' . $eachtraff['bytes'] . '"');

$rows.= wf_TableRow($cells, 'row3');

}

}

$result=wf_TableBody($rows, '100%', 0, 'sortable');

return($result);

}

show_window(__('Traffic detailed stats'), web_DSShow($user));

        show_window('', web_UserControls($user));

 

 

        } else {

show_error(__('No detailstats database exists'));

}

if (isset($_GET['day'])) {

            $day = $_GET['day'];

            show_window(__('Detailed stats by day'), web_DSShowDayStats($user, $day));

        }

} else {

    show_error(__('You cant control this module'));

}

?>

 

 

В файле /usr/local/stat/config.php лежат данные для подключения к БД.

В файле /.../billing/api/libs/api.userprofile я сменил ссылку статистки на детальную статистику.

Edited by Golthana
Link to post
Share on other sites

За ini_set("memory_limit", "512M"); нужно бить ногами по лицу.

 

Вот выдержка из документации:

 

Небуферизуемые результирующие наборы

Если клиентские ресурсы ограничены, и в тоже время не требуется поддерживать низкую нагрузку на сервер, можно использовать не буферизованные результирующие наборы. Навигация по таким таблицам невозможна, потому что так или иначе должны быть обработаны все строки набора.

 

Пример #3 Навигация по строкам не буферизованной результирующей таблицы

<?php
$mysqli
->real_query("SELECT id FROM test ORDER BY id ASC");
$res $mysqli->use_result();

echo 
"Порядок строк в результирующем наборе...\n";
while (
$row $res->fetch_assoc()) {
    echo 
" id = " $row['id'] . "\n";
}

?>
Link to post
Share on other sites
  On 10/21/2016 at 9:26 AM, Golthana said:

 

  On 10/21/2016 at 7:42 AM, Dmitry2 said:
За ini_set("memory_limit", "512M"); нужно бить ногами по лицу

 

Почитаю.

 

Плюс неплохо было бы освобождать внутренние буфера mysql клиента c помощью mysqli_free_result() а также память неиспользуемых переменных

 

собственно, код программы должен начинаться так:

<?php
$time_start = microtime(true);
$init_mem = memory_get_usage();

а заканчиваться так:

echo "Memory statistic<BR />\n";
echo 'Initial: ' . $init_mem . " bytes<BR />\n";
echo 'Peak: ' . memory_get_peak_usage() . " bytes<BR />\n";
echo 'End: ' . memory_get_usage(). " bytes<BR />\n";
$time_end = microtime(true) - $time_start;
echo "Скрипт выполнялся $time_end секунд\n";
?>
Edited by Dmitry2
Link to post
Share on other sites
  On 10/21/2016 at 11:21 AM, Dmitry2 said:
собственно, код программы должен начинаться так:

Нет, не должен.

Нахрен это все не нужно, если есть нормальный встроенный иерархический профайлер. Но документация ведь для слабаков, да?

post-12401-0-72495600-1477063989_thumb.png

Edited by nightfly
Link to post
Share on other sites

В любом случае пока работает шустро, но надо отметить, что БД еще маленькая. Соберу месяц и посмотрим сколько будет идти выборка данных.

 

Кстати, забил написать. Данные собираю и кладу в базу с помощью pmacct. Есть портах и проста в настройке.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Golthana
      А как посмотреть детальную статистику за прошедший месяц?
       
      Или, если у кого-то есть какие-то рабочие решение организации ведение статистики, тоже буду рад советам.
      Заранее всем спасибо.
    • By AleksNet
      Доброй ночи!!
      Подскажите почему при включении детальной статистике в профиле пользователя,  при обращении к детальной статистике в "Пользователи для которых включена детальная статистика".
      Выдает: "ОШИБКА.База данных детальной статистики отсутствует"
      Если я правильно понимаю, то для решения данной проблемы достаточно добавить базу детальной статистики?!?!?
      Если это так, то назревает другой вопрос: "где можно взять эту самую базу детальной статистики???"
      Просто более раньше устанавливал Ubilling, там все как говорится из коробки работало.
      В этот раз даже после третьего раза не хочет деталку показывать.
      Сильно не пинайте.

×
×
  • Create New...