ОсновноеRadiotalkПользовательское
Технологии вещания, софт, скрипты
7   •   Посмотреть все темы

Графическая статистика для Radio Toolbox (Windows)

 

1572
KyPIIaToB @KyPIIaToB
Иметься: старая машина под виндой на которой вертится Sam, Icecast, и апачь для малых нужд.

Задача: требуется собирать статистику по часам, суткам и т.д.

Условия: варианты с cacti и mrtg не подходят по причине крайне малого оставшегося машинного ресурса.

Решение:
Найдена и заюзана программа Radio Toolbox, она мониторит и ведет логи по всем необходимым потокам (в нашем случае три), логи имеют вид: 03_10_2009_rtb_log.txt

Используем два php скрипта, один простой, другой повеселее.

1. для перевода логов RTB в что нибудь попроще.

  1. $file_name='C:/Radio Toolbox/logs/' .$m .'_' .$d. '_' .$y. '_rtb_log.txt';
  2. //директория хранениея логов Radio Toolbox с выборкой нужной даты
  3. $r=fopen($file_name,'r');
  4. $text=fread($r,filesize($file_name));
  5. fclose($r);
  6. $massiv=explode("\r\n", $text);
  7. foreach ($massiv as $txt) {
  8. $h = substr($txt,12,2);
  9. $h=$h*1;
  10. $temp=explode(" ", $txt);
  11. $l[$h]=$l[$h]+$temp[1];
  12. $s[$h]=$s[$h]+1;
  13. }
  14. $txtout='<?php'."\r\n";
  15. for ($i=0; $i<=23; $i++) {
  16. $txtout=$txtout. '$ls[]=' .$l[$i]. '; $kz[]=' .$s[$i]. ";\r\n";
  17. }
  18. $txtout=$txtout.'?>';
  19. //запись в файл
  20. $fp = fopen ("C:/listens/".$y.$m.$d.".dat", "w");
  21. fwrite($fp,$txtout);
  22. fclose($fp);
  23. ?>

данный скрипт запускаем после полуночи (когда начинает вестись лог на новый день)
php toBD.php (или диспетчером задач или crontab)

в итоге у нас получается файл 20010310.dat
обыкновенный текстовик формата

  1. <?php
  2. $ls[]=165; $kz[]=120;
  3. <sciped>
  4. $ls[]=360; $kz[]=120;
  5. ?>

всего в файле 24 записе (по 1 на час), первое значение сумма слушателей зарегенных в логах за час, второе количество замеров, т.е. среднее в час, это сумма/замеры

2. вывод статистики, более сложный и веселый

  1. <?php
  2. $kratnost=5; //кратность графика
  3. $font="ariblk.ttf";
  4. //имя шрифта
  5. $dir='C:/*.dat';
  6. //путь к файлам БД =)
  7. $y=$_GET['y'];
  8. $m=$_GET['m'];
  9. $d=$_GET['d'];
  10. $in=$_GET['in'];
  11. $t=$_GET['t'];
  12. if ($y<2009) {$y=date("Y",time()-86500);}
  13. if ($y>2038) {$y=date("Y",time()-86500);}
  14. if ($m<1) {$m=date("m",time()-86500);}
  15. if ($m>12) {$m=date("m",time()-86500);}
  16. if ($d<1) {$d=date("d",time()-86500);}
  17. if ($d>31) {$d=date("d",time()-86500);}
  18. if ($in==0) {$in=1;}
  19. if ($in<0) {$in=1;}
  20. if ($in>3) {$in=1;}
  21. if ($t<1) {$t=1;}
  22. if ($t>3) {$t=1;}
  23. if ($t==1 && $in>2) {$in=2;}
  24. if ($t==2 && $in<2) {$in=2;}
  25. if ($t==3 && $in<3) {$in=3;}
  26. $d=substr("0000" .$d,-2,2);
  27. $m=substr("0000" .$m,-2,2);
  28. if ($in==1) {
  29. $d1=$y.$m.$d;
  30. $d2=$y.$m.$d;
  31. }
  32. if ($in==2) {
  33. $d1=$y.$m."01";
  34. $d2=$y.$m."31";
  35. }
  36. if ($in==3) {
  37. $d1=$y."0101";
  38. $d2=$y."1231";
  39. }
  40. $d1=$d1*1;
  41. $d2=$d2*1;
  42. if ($t<0) {$t=1;}
  43. if ($t>3) {$t=1;}
  44. $mass=glob($dir);
  45. $x=0;
  46. $td=0;
  47. $pem=0;
  48. $nachalo=mktime(0,0,0,substr($d1,4,2),substr($d1,6,2),substr($d1,0,4));
  49. //обработка БД согласно вводным
  50. foreach ($mass as $filename){
  51. $locfile= substr($filename,-12,8);
  52. $locfile=$locfile*1;
  53. if ($locfile >=$d1 && $locfile <=$d2) {
  54. $tm=1*substr($filename,-8,2);
  55. if ($pem==0) {$pem=1;$pm=$tm;}
  56. if ($t==3 && $pm<>$tm) {
  57. $pm=$tm;
  58. $l[$td]=array_sum($ls);
  59. $s[$td]=array_sum($kz);
  60. $ls='';
  61. $kz='';
  62. $td=$td+1;
  63. }
  64. include($filename);
  65. if ($t==2) {
  66. $l[$td]=array_sum($ls);
  67. $s[$td]=array_sum($kz);
  68. $ls='';
  69. $kz='';
  70. $td=$td+1;
  71. }
  72. }
  73. }
  74. if ($t==1) {
  75. $name="hours";
  76. $l=$ls;
  77. $s=$kz;
  78. }
  79. if ($t==2) {
  80. $name="days";
  81. }
  82. if ($t==3) {
  83. $name="months";
  84. if ($t==3) {
  85. $l[$td]=array_sum($ls);
  86. $s[$td]=array_sum($kz);
  87. }
  88. }
  89. $k=sizeof($l);
  90. $vivod=0;
  91. if (array_sum($l)==0) {$vivod=2;}
  92. if ($k==0) {$vivod=1;}
  93. $vis=0;
  94. for ($i=0;$i<$k;$i++){
  95. $r=$l[$i]/$s[$i];
  96. if ($vis<$r) {$vis=$r;}
  97. }
  98. $vt=250;
  99. $vis=$kratnost*ceil($vis/$kratnost);
  100. if ($t==1 && $in==2) {$vt=300;}
  101. if ($t==2 && $in==3) {$vt=300;}
  102. //генерация графика
  103. header("Content-type: image/png");
  104. $image = imageCreate(800, $vt);
  105. $colorback = imageColorAllocate($image, 0, 0, 0);
  106. $color1 = imageColorAllocate($image, 211, 211, 211);
  107. $color2 = imageColorAllocate($image, 250, 250, 220);
  108. imageFilledRectangle($image, 0, 0, 99, 99, $colorback);
  109. imageLine($image,30,10,30, 240,$color2);
  110. $max=$k;
  111. if ($vivod==0) {
  112. if ($t==1 && $in==1) {$max=23;}
  113. if ($t==1 && $in==2) {$max=24*(date("t",$nachalo)-1);}
  114. if ($t==2 && $in==2) {$max=date("t",$nachalo)-1;}
  115. if ($t==2 && $in==3) {$max=365;}
  116. if ($t==3 && $in==3) {$max=11;}
  117. $sh=750/($max+1);
  118. $vd=round($vis);
  119. $st=0;
  120. if ($vis==0) {$rp=20;$st=1;}
  121. if ($vis<>0) {
  122. $rp=200*$st/$vis;
  123. while ($rp<10) {
  124. $st=$st+$kratnost;
  125. $rp=200*$st/$vis;
  126. }
  127. }
  128. $i=0;
  129. while ($i<=$vd) {
  130. $v=200*$i/$vis;
  131. $bbox=imagettfbbox(6, 0, $font, $i);
  132. imageLine($image,20,229-$v,780, 229-$v,$color2);
  133. imagettftext ($image, 6, 0, 30-$bbox[2]-3, 229-$v-2, $color2, $font,$i);
  134. $i=$i+$st;
  135. }
  136. for ($i=0;$i<$k;$i++){
  137. $r=$l[$i]/$s[$i];
  138. $v=200*$r/$vis;
  139. $nc=$i+1;
  140. if ($t==1) {$nc=$i;}
  141. imageFilledRectangle($image, 31+$sh*$i, 229-$v, 29+$sh*($i+1), 229, $color1);
  142. $bbox=imagettfbbox(6, 0, $font, $i);
  143. }
  144. $st=1;$oo=1;$u=0;
  145. if ($t==1 && $in==2) {$st=24;$oo=0;$u=-90;}
  146. if ($t==2 && $in==3) {$st=30;$oo=0;$u=-90;}
  147. $rp=750*$st/$max;
  148. while ($rp<10) {
  149. $st=$st+1;
  150. $rp=200*$sh;
  151. }
  152. $i=0;
  153. while ($i<=$max) {
  154. $v=750*$i/$max;
  155. $io=$i;
  156. if ($t<>1) {$io=$i+1;}
  157. if ($t==1 && $in==2) {$io=date("d-M",$nachalo+3600*$i);}
  158. if ($t==2 && $in==3) {$io=date("M",$nachalo+24*3600*$i);}
  159. if ($t==3) {$io=date("M",$nachalo+31*24*3600*$i);}
  160. if ($i<>0) {imagettftext ($image, 6, $u, 31+$sh+$sh*$i-$sh/2-$bbox[2]/2, 240-$bbox[3]/2, $color2, $font,$io);}
  161. if ($i==0 && $oo==1) {imagettftext ($image, 6, $u, 31+$sh+$sh*$i-$sh/2-$bbox[2]/2, 240-$bbox[3]/2, $color2, $font,$io);}
  162. $i=$i+$st;
  163. }
  164. }
  165. if ($vivod==1) {imagettftext ($image, 20, 0, 175, 150, $color1, $font,"NOT DATA IN STORAGE");}
  166. if ($vivod==2) {imagettftext ($image, 20, 0, 260, 150, $color1, $font,"Not Listens");}
  167. $dati=substr($d1,0,4).":".substr($d1,4,2).":".substr($d1,6,2)."-".substr($d2,0,4).":".substr($d2,4,2).":".substr($d2,6,2)." (" . date("T",$nachalo). ")";
  168. if ($d1==$d2) {$dati=substr($d1,0,4).":".substr($d1,4,2).":".substr($d1,6,2)." (" . date("T",$nachalo). ")";}
  169. imagettftext ($image, 8, 0, 40, 10, $color2, $font,$dati);
  170. imagettftext ($image, 6, 0, 760, 10, $color2, $font,'V.2.9');
  171. imagettftext ($image, 6, 0, 2, 247, $color2, $font,$name);
  172. imageInterlace($image, 1);
  173. imagepng($image);
  174. ?>

Переменные, которые можно передать скрипту
d - день
m - месяц
y - год
t - тип графика (1-по часам, 2- по дням, 3 - по месяцам)
in - период графика (1 - день, 2 - месяц, 3 - год)
т.е. можно укозать скрипту данные на которое отображать, шаг графика и период
так например:
script.php?d=8&m=3&y=2009&t=1&in=1 отразит статистику за 8 марта 2009 по часам.
script.php?y=2009&t=3&in=3 отразит статистику за 2009 год по месяцам
неуказанные данные принимаются по умолчанию: текущая дата, по часам за сутки
В целях не загромождения графика ограничения в комбинациях периода и шага (для часов, только за сутки и месяц, для дней, только за месяц и год, для месяца, только за год)

Результат работы: **********

Аспекты: так как код и так довольно громоздок, дни когда логи не велись (с 1 января 2009 года, по 7 марта 2009 года) созданы "пустые" файлы:

  1. <?php
  2. $ls[]=0; $kz[]=120;
  3. <sciped>
  4. $ls[]=0; $kz[]=120;
  5. ?>

Заглушки: при запросе данных, которых нет в БД или только "пустые"записи, выдается соответствующее предупреждение.

Плюсы:
1. вторая версия скрипта (та что представлена выше) довольна шустра и имеет потенциал развития (например отображение графика по минутам, но в этом случае целесообразно для "поминутных" записей хранить в отдельной БД.
2. оно работает.

Минусы:
1. Статистика только раньше текущих суток.
2. отображение "средних" показателей

Скрипт от Klef

Отредактировано KyPIIaToB - 22.05.2011
0





Согласие на обработку данных на нашем сайте

Продолжая просматривать страницу, вы соглашаетесь с использованием файлов «Cookie» и с Политикой конфиденциальности «Privacy».
Наверху или внизу страницы вы можете изменить валюту и язык по умолчанию. Английская версия сайта ещё находится в доработке и доступна не полностью.