5 include_once
"Services/Authentication/classes/class.ilSessionStatistics.php";
38 switch($ilCtrl->getNextClass())
41 $cmd = $ilCtrl->getCmd(
"current");
52 $ilTabs->addSubTab(
"current", $lng->txt(
"trac_current_system_load"),
53 $ilCtrl->getLinkTarget($this,
"current"));
54 $ilTabs->addSubTab(
"short", $lng->txt(
"trac_short_system_load"),
55 $ilCtrl->getLinkTarget($this,
"short"));
56 $ilTabs->addSubTab(
"long", $lng->txt(
"trac_long_system_load"),
57 $ilCtrl->getLinkTarget($this,
"long"));
58 $ilTabs->addSubTab(
"periodic", $lng->txt(
"trac_periodic_system_load"),
59 $ilCtrl->getLinkTarget($this,
"periodic"));
62 protected function current($a_export =
false)
66 $ilTabs->activateSubTab(
"current");
85 case self::MODE_TODAY:
86 $time_from = strtotime(
"today");
87 $time_to = strtotime(
"tomorrow")-1;
91 case self::MODE_LAST_DAY:
93 $time_from = $time_to-60*60*24;
97 case self::MODE_LAST_WEEK:
99 $time_from = $time_to-60*60*24*7;
103 case self::MODE_LAST_MONTH:
105 $time_from = $time_to-60*60*24*30;
110 $mode_options = array(
111 self::MODE_TODAY => $lng->txt(
"trac_session_statistics_mode_today"),
112 self::MODE_LAST_DAY => $lng->txt(
"trac_session_statistics_mode_last_day"),
113 self::MODE_LAST_WEEK => $lng->txt(
"trac_session_statistics_mode_last_week"),
114 self::MODE_LAST_MONTH => $lng->txt(
"trac_session_statistics_mode_last_month"));
116 $title = $lng->txt(
"trac_current_system_load").
" - ".$mode_options[$mode];
117 $data = $this->
buildData($time_from, $time_to, $title);
122 include_once
"Services/Form/classes/class.ilPropertyFormGUI.php";
123 $ilToolbar->setFormAction($ilCtrl->getFormAction($this,
"current"));
125 $mode_selector =
new ilSelectInputGUI(
" ".$lng->txt(
"trac_scale"),
"smd");
127 $mode_selector->setValue($mode);
128 $ilToolbar->addInputItem($mode_selector,
true);
130 $measure_options = array(
131 "avg" => $lng->txt(
"trac_session_active_avg"),
132 "min" => $lng->txt(
"trac_session_active_min"),
133 "max" => $lng->txt(
"trac_session_active_max"));
135 $measure_selector =
new ilSelectInputGUI(
" ".$lng->txt(
"trac_measure"),
"smm");
136 $measure_selector->
setOptions($measure_options);
137 $measure_selector->setValue($measure);
138 $ilToolbar->addInputItem($measure_selector,
true);
140 $ilToolbar->addFormButton($lng->txt(
"ok"),
"current");
142 if(
sizeof($data[
"active"]))
144 $ilToolbar->addSeparator();
145 $ilToolbar->addFormButton($lng->txt(
"export"),
"currentExport");
148 $tpl->setContent($this->
render($data, $scale, $measure));
163 protected function short($a_export =
false)
167 $ilTabs->activateSubTab(
"short");
178 str_pad($org[
"m"], 2,
"0", STR_PAD_LEFT).
179 str_pad($org[
"d"], 2,
"0", STR_PAD_LEFT);
198 $time_to = mktime(23, 59, 59, substr($start, 4, 2), substr($start, 6, 2),
199 substr($start, 0, 4));
203 $time_from = $time_to-60*60*24;
207 case self::MODE_WEEK:
208 $time_from = $time_to-60*60*24*7;
213 $mode_options = array(
214 self::MODE_DAY => $lng->txt(
"trac_session_statistics_mode_day"),
215 self::MODE_WEEK => $lng->txt(
"trac_session_statistics_mode_week")
218 $title = $lng->txt(
"trac_short_system_load").
" - ".$mode_options[$mode];
219 $data = $this->
buildData($time_from, $time_to, $title);
224 include_once
"Services/Form/classes/class.ilPropertyFormGUI.php";
225 $ilToolbar->setFormAction($ilCtrl->getFormAction($this,
"short"));
229 $ilToolbar->addInputItem($start_selector,
true);
231 $mode_selector =
new ilSelectInputGUI(
" ".$lng->txt(
"trac_scale"),
"smd");
233 $mode_selector->setValue($mode);
234 $ilToolbar->addInputItem($mode_selector,
true);
236 $measure_options = array(
237 "avg" => $lng->txt(
"trac_session_active_avg"),
238 "min" => $lng->txt(
"trac_session_active_min"),
239 "max" => $lng->txt(
"trac_session_active_max"));
241 $measure_selector =
new ilSelectInputGUI(
" ".$lng->txt(
"trac_measure"),
"smm");
242 $measure_selector->
setOptions($measure_options);
243 $measure_selector->setValue($measure);
244 $ilToolbar->addInputItem($measure_selector,
true);
246 $ilToolbar->addFormButton($lng->txt(
"ok"),
"short");
248 if(
sizeof($data[
"active"]))
250 $ilToolbar->addSeparator();
251 $ilToolbar->addFormButton($lng->txt(
"export"),
"shortExport");
254 $tpl->setContent($this->
render($data, $scale, $measure));
267 protected function long($a_export =
false)
271 $ilTabs->activateSubTab(
"long");
282 str_pad($org[
"m"], 2,
"0", STR_PAD_LEFT).
283 str_pad($org[
"d"], 2,
"0", STR_PAD_LEFT);
295 $time_to = mktime(23, 59, 59, substr($start, 4, 2), substr($start, 6, 2),
296 substr($start, 0, 4));
299 case self::MODE_WEEK:
300 $time_from = $time_to-60*60*24*7;
304 case self::MODE_MONTH:
305 $time_from = $time_to-60*60*24*30;
309 case self::MODE_YEAR:
310 $time_from = $time_to-60*60*24*365;
315 $mode_options = array(
316 self::MODE_WEEK => $lng->txt(
"trac_session_statistics_mode_week"),
317 self::MODE_MONTH => $lng->txt(
"trac_session_statistics_mode_month"),
318 self::MODE_YEAR => $lng->txt(
"trac_session_statistics_mode_year")
321 $title = $lng->txt(
"trac_long_system_load").
" - ".$mode_options[$mode];
322 $data = $this->
buildData($time_from, $time_to, $title);
327 include_once
"Services/Form/classes/class.ilPropertyFormGUI.php";
328 $ilToolbar->setFormAction($ilCtrl->getFormAction($this,
"long"));
332 $ilToolbar->addInputItem($start_selector,
true);
334 $mode_selector =
new ilSelectInputGUI(
" ".$lng->txt(
"trac_scale"),
"smd");
336 $mode_selector->setValue($mode);
337 $ilToolbar->addInputItem($mode_selector,
true);
339 $ilToolbar->addFormButton($lng->txt(
"ok"),
"long");
341 if(
sizeof($data[
"active"]))
343 $ilToolbar->addSeparator();
344 $ilToolbar->addFormButton($lng->txt(
"export"),
"longExport");
347 $tpl->setContent($this->
render($data, $scale));
364 $ilTabs->activateSubTab(
"periodic");
375 "-".str_pad($org[
"m"], 2,
"0", STR_PAD_LEFT).
376 "-".str_pad($org[
"d"], 2,
"0", STR_PAD_LEFT);
383 $_REQUEST[
"sto"] = date(
"Y-m-d", strtotime(
"-7 days"));
389 "-".str_pad($org[
"m"], 2,
"0", STR_PAD_LEFT).
390 "-".str_pad($org[
"d"], 2,
"0", STR_PAD_LEFT);
395 $time_to = mktime(23, 59, 59, substr($start, 5, 2), substr($start, 8, 2),
396 substr($start, 0, 4));
397 $time_from = mktime(0, 0, 1, substr($end, 5, 2), substr($end, 8, 2),
401 if($time_to < $time_from)
404 $time_to = $time_from;
408 $title = $lng->txt(
"trac_periodic_system_load");
409 $data = $this->
buildData($time_from, $time_to, $title);
414 include_once
"Services/Form/classes/class.ilPropertyFormGUI.php";
415 $ilToolbar->setFormAction($ilCtrl->getFormAction($this,
"periodic"));
419 $ilToolbar->addInputItem($end_selector,
true);
423 $ilToolbar->addInputItem($start_selector,
true);
425 $ilToolbar->addFormButton($lng->txt(
"ok"),
"periodic");
427 if(
sizeof($data[
"active"]))
429 $ilToolbar->addSeparator();
430 $ilToolbar->addFormButton($lng->txt(
"export"),
"periodicExport");
433 $tpl->setContent($this->
render($data, self::SCALE_PERIODIC_WEEK));
437 $this->
exportCSV($data, self::SCALE_PERIODIC_WEEK);
452 include_once
"Services/Authentication/classes/class.ilSessionControl.php";
455 $control_active = ($ilSetting->get(
'session_handling_type', 0) == 1);
470 $left =
new ilTemplate(
"tpl.session_statistics_left.html",
true,
true,
"Services/Authentication");
472 $left->setVariable(
"CAPTION_CURRENT", $lng->txt(
"users_online"));
473 $left->setVariable(
"VALUE_CURRENT", $active);
475 $left->setVariable(
"CAPTION_LAST_AGGR", $lng->txt(
"trac_last_aggregation"));
478 $left->setVariable(
"CAPTION_LAST_MAX", $lng->txt(
"trac_last_maxed_out_sessions"));
481 $left->setVariable(
"CAPTION_SESSION_CONTROL", $lng->txt(
"sess_load_dependent_session_handling"));
484 $left->setVariable(
"VALUE_SESSION_CONTROL", $lng->txt(
"no"));
488 $left->setVariable(
"VALUE_SESSION_CONTROL", $lng->txt(
"yes"));
490 $left->setCurrentBlock(
"control_details");
492 $left->setVariable(
"CAPTION_SESSION_CONTROL_LIMIT", $lng->txt(
"session_max_count"));
493 $left->setVariable(
"VALUE_SESSION_CONTROL_LIMIT", $control_max_sessions);
495 $left->setVariable(
"CAPTION_SESSION_CONTROL_IDLE_MIN", $lng->txt(
"session_min_idle"));
496 $left->setVariable(
"VALUE_SESSION_CONTROL_IDLE_MIN", $control_min_idle);
498 $left->setVariable(
"CAPTION_SESSION_CONTROL_IDLE_MAX", $lng->txt(
"session_max_idle"));
499 $left->setVariable(
"VALUE_SESSION_CONTROL_IDLE_MAX", $control_max_idle);
501 $left->setVariable(
"CAPTION_SESSION_CONTROL_IDLE_FIRST", $lng->txt(
"session_max_idle_after_first_request"));
502 $left->setVariable(
"VALUE_SESSION_CONTROL_IDLE_FIRST", $control_max_idle_first);
504 $left->parseCurrentBlock();
508 if($ilAccess->checkAccess(
"write",
"", (
int)
$_REQUEST[
"ref_id"]))
510 $left->setVariable(
"URL_SYNC", $ilCtrl->getFormAction($this,
"adminSync"));
511 $left->setVariable(
"CMD_SYNC",
"adminSync");
512 $left->setVariable(
"TXT_SYNC", $lng->txt(
"trac_sync_session_stats"));
518 protected function buildData($a_time_from, $a_time_to, $a_title)
526 $opened = (int)$counters[
"opened"];
527 $closed_limit = (int)$counters[
"closed_limit"];
528 unset($counters[
"opened"]);
529 unset($counters[
"closed_limit"]);
537 $data[
"title"] = $a_title.
" (".
541 $data[
"maxed_out_time"] = array($lng->txt(
"trac_maxed_out_time"), $maxed_out_duration);
542 $data[
"maxed_out_counter"] = array($lng->txt(
"trac_maxed_out_counter"), $closed_limit);
543 $data[
"opened"] = array($lng->txt(
"trac_sessions_opened"), $opened);
544 $data[
"closed"] = array($lng->txt(
"trac_sessions_closed"), array_sum($counters));
545 foreach($counters as $type => $counter)
547 $data[
"closed_details"][] = array($lng->txt(
"trac_".$type), (int)$counter);
555 protected function render($a_data, $a_scale, $a_measure = null)
559 $center =
new ilTemplate(
"tpl.session_statistics_center.html",
true,
true,
"Services/Authentication");
561 foreach($a_data as $idx => $item)
570 case "closed_details":
571 $center->setCurrentBlock(
"closed_details");
572 foreach($item as $detail)
574 $center->setVariable(
"CAPTION_CLOSED_DETAILS", $detail[0]);
575 $center->setVariable(
"VALUE_CLOSED_DETAILS", $detail[1]);
576 $center->parseCurrentBlock();
581 $tpl_var = strtoupper($idx);
582 $center->setVariable(
"CAPTION_".$tpl_var, $item[0]);
583 $center->setVariable(
"VALUE_".$tpl_var, $item[1]);
588 if($a_data[
"active"])
590 $center->setVariable(
"CHART", $this->
getChart($a_data[
"active"], $a_data[
"title"], $a_scale, $a_measure));
597 return $center->get();
609 protected function getChart($a_data, $a_title, $a_scale = self::SCALE_DAY, $a_measure = null)
613 include_once
"Services/Chart/classes/class.ilChart.php";
614 $chart =
new ilChart(
"objstacc", 700, 500);
615 $chart->setYAxisToInteger(
true);
618 $chart->setLegend($legend);
622 $a_measure = array(
"min",
"avg",
"max");
624 else if(!is_array($a_measure))
626 $a_measure = array($a_measure);
629 $colors_map = array(
"min" =>
"#00cc00",
633 $colors = $act_line = array();
634 foreach($a_measure as $measure)
637 $act_line[$measure]->setLineSteps(
true);
638 $act_line[$measure]->setLabel($lng->txt(
"trac_session_active_".$measure));
639 $colors[] = $colors_map[$measure];
642 if($a_scale != self::SCALE_PERIODIC_WEEK)
645 $max_line->setLabel($lng->txt(
"session_max_count"));
646 $colors[] =
"#cc0000";
649 $chart->setColors($colors);
654 $scale = ceil(
sizeof($chart_data)/5);
656 foreach($chart_data as $idx => $item)
658 $date = $item[
"slot_begin"];
660 if($a_scale == self::SCALE_PERIODIC_WEEK || !($idx % ceil($scale)))
664 case self::SCALE_DAY:
665 $labels[$date] = date(
"H:i", $date);
668 case self::SCALE_WEEK:
669 $labels[$date] = date(
"d.m. H", $date).
"h";
672 case self::SCALE_MONTH:
673 $labels[$date] = date(
"d.m.", $date);
676 case self::SCALE_YEAR:
677 $labels[$date] = date(
"Y-m", $date);
680 case self::SCALE_PERIODIC_WEEK:
681 $day = substr($date, 0, 1);
682 $hour = substr($date, 1, 2);
683 $min = substr($date, 3, 2);
686 $day_value = ($day-1)*60*60*24;
687 $date = $day_value+$hour*60*60+$min*60;
690 if($hour != $old_hour && $hour && $hour%6 == 0)
692 $labels[$date] = $hour;
705 foreach($a_measure as $measure)
707 $value = (int)$item[
"active_".$measure];
708 $act_line[$measure]->addPoint($date, $value);
711 if($a_scale != self::SCALE_PERIODIC_WEEK)
713 $max_line->addPoint($date, (
int)$item[
"max_sessions"]);
717 foreach($act_line as $line)
719 $chart->addData($line);
721 if($a_scale != self::SCALE_PERIODIC_WEEK)
723 $chart->addData($max_line);
726 $chart->setTicks($labels, null,
true);
728 return $chart->getHTML();
736 case self::SCALE_DAY:
740 case self::SCALE_WEEK:
746 foreach($a_data as $item)
748 $date_parts = getdate($item[
"slot_begin"]);
753 case self::SCALE_MONTH:
755 $slot = mktime($date_parts[
"hours"], 0, 0, $date_parts[
"mon"], $date_parts[
"mday"], $date_parts[
"year"]);
758 case self::SCALE_YEAR:
760 $slot = mktime(0, 0, 1, $date_parts[
"mon"], $date_parts[
"mday"], $date_parts[
"year"]);
763 case self::SCALE_PERIODIC_WEEK:
765 $day = $date_parts[
"wday"];
770 $slot = $day.date(
"His", $item[
"slot_begin"]);
775 foreach($item as $id => $value)
777 switch(substr($id, -3))
780 if(!$tmp[$slot][$id] || $value < $tmp[$slot][$id])
782 $tmp[$slot][$id] = $value;
787 if(!$tmp[$slot][$id] || $value > $tmp[$slot][$id])
789 $tmp[$slot][$id] = $value;
794 $tmp[$slot][$id][] = $value;
800 foreach($tmp as $slot => $attr)
802 $tmp[$slot][
"active_avg"] = (int)round(array_sum($attr[
"active_avg"])/
sizeof($attr[
"active_avg"]));
803 $tmp[$slot][
"slot_begin"] = $slot;
806 return array_values($tmp);
819 $ilCtrl->redirect($this);
827 include_once
'./Services/Link/classes/class.ilLink.php';
829 include_once
"./Services/Utilities/classes/class.ilCSVWriter.php";
831 $csv->setSeparator(
";");
837 $lng->txt(
"trac_name_of_installation") => $ilClientIniFile->readVariable(
'client',
'name'),
838 $lng->txt(
"trac_report_date") =>
840 $lng->txt(
"trac_report_owner") => $ilUser->getFullName(),
842 foreach($a_data as $idx => $item)
847 $meta[$lng->txt(
"title")] = $item;
854 case "closed_details":
855 foreach($item as $detail)
857 $meta[$a_data[
"closed"][0].
" - ".$detail[0]] = $detail[1];
862 $meta[$item[0]] = $item[1];
866 foreach($meta as $caption => $value)
868 $csv->addColumn(strip_tags($caption));
869 $csv->addColumn(strip_tags($value));
880 $first = array_keys(array_shift($first));
881 foreach ($first as $column)
884 if($a_scale == self::SCALE_PERIODIC_WEEK && $column ==
"slot_begin")
886 $csv->addColumn(
"weekday");
887 $csv->addColumn(
"time");
891 $csv->addColumn(strip_tags($column));
897 foreach($aggr_data as
$row)
899 foreach ($row as $column => $value)
903 $value = implode(
', ', $value);
909 if($a_scale == self::SCALE_PERIODIC_WEEK)
912 $value = substr($value, 1, 2).
":".substr($value, 3, 2);
918 $value = date(
"d.m.Y H:i", $value);
921 $csv->addColumn(strip_tags($value));
927 $filename .=
"session_statistics_".date(
"Ymd", $now).
".csv";
928 header(
"Content-type: text/comma-separated-values");
929 header(
"Content-Disposition: attachment; filename=\"".
$filename.
"\"");
930 header(
"Expires: 0");
931 header(
"Cache-Control: must-revalidate, post-check=0,pre-check=0");
932 header(
"Pragma: public");
933 echo $csv->getCSVString();