19declare(strict_types=1);
29 public static function isActive(): bool
36 return (
bool)
$ilSetting->get(
'session_statistics',
'1');
39 public static function createRawEntry(
string $a_session_id,
int $a_session_type,
int $a_timestamp,
int $a_user_id): void
46 if (!$a_user_id || !$a_session_id || !self::isActive()) {
53 'usr_session_stats_raw',
69 public static function closeRawEntry($a_session_id, ?
int $a_context =
null, $a_expired_at =
null): void
76 if (!self::isActive()) {
81 if (!is_array($a_session_id)) {
83 $end_time = $a_expired_at;
87 $sql =
'UPDATE usr_session_stats_raw' .
93 ' AND end_time IS NULL';
94 $ilDB->manipulate($sql);
97 elseif (!$a_expired_at) {
98 $sql =
'UPDATE usr_session_stats_raw' .
104 ' AND end_time IS NULL';
105 $ilDB->manipulate($sql);
109 foreach ($a_session_id as
$id => $ts) {
110 $sql =
'UPDATE usr_session_stats_raw' .
116 ' AND end_time IS NULL';
117 $ilDB->manipulate($sql);
126 private static function getCurrentSlot(
int $a_now): ?array
134 $sql =
'SELECT MAX(slot_end) previous_slot_end FROM usr_session_stats';
137 $previous_slot_end = $row[
'previous_slot_end'];
141 if (!$previous_slot_end) {
142 $slot = (
int) (floor(date(
'i') / self::SLOT_SIZE));
145 $current_slot_begin = mktime((
int) date(
'H', $a_now) - 1, 60 - self::SLOT_SIZE, 0);
149 $current_slot_begin = mktime((
int) date(
'H', $a_now), ($slot - 1) * self::SLOT_SIZE, 0);
152 $current_slot_begin = $previous_slot_end + 1;
158 if ($current_slot_end < $a_now) {
159 return [$current_slot_begin, $current_slot_end];
165 private static function getNumberOfActiveRawSessions(
int $a_time):
int
172 return (
int)
$ilDB->fetchAssoc(
174 self::getNumberOfActiveRawSessionsPreparedStatement(),
183 private static function getRawData(
int $a_begin,
int $a_end): Generator
191 self::getRawDataPreparedStatement(),
203 private static function createNewAggregationSlot(
int $a_now): ?array
210 $ilAtomQuery =
$ilDB->buildAtomQuery();
211 $ilAtomQuery->addTableLock(
'usr_session_stats');
215 $slot = self::getCurrentSlot($a_now);
216 if (!is_array($slot)) {
226 $ilDB->insert(
'usr_session_stats', $fields);
236 if (!self::isActive()) {
240 $slot = self::createNewAggregationSlot($a_now);
241 while (is_array($slot)) {
242 self::aggregateRawHelper($slot[0], $slot[1]);
243 $slot = self::createNewAggregationSlot($a_now);
247 self::deleteAggregatedRaw($a_now);
250 private static function getNumberOfActiveRawSessionsPreparedStatement():
ilDBStatement
252 if (self::$number_of_active_raw_sessions_statement ===
null) {
258 self::$number_of_active_raw_sessions_statement =
$ilDB->prepare(
259 'SELECT COUNT(*) counter FROM usr_session_stats_raw '
260 .
'WHERE (end_time IS NULL OR end_time >= ?) '
261 .
'AND start_time <= ? '
270 private static function getAggregatedRawDataPreparedStatement():
ilDBStatement
272 if (!self::$aggregated_raw_data_statement) {
278 self::$aggregated_raw_data_statement =
$ilDB->prepareManip(
279 'UPDATE usr_session_stats '
280 .
'SET active_min = ?, '
285 .
'closed_manual = ?, '
286 .
'closed_expire = ?, '
287 .
'closed_login = ?, '
289 .
'WHERE slot_begin = ? AND slot_end = ?',
309 private static function getRawDataPreparedStatement():
ilDBStatement
311 if (!self::$raw_data_statement) {
317 self::$raw_data_statement =
$ilDB->prepare(
318 'SELECT start_time, end_time, end_context FROM usr_session_stats_raw' .
319 ' WHERE start_time <= ?' .
320 ' AND (end_time IS NULL OR end_time >= ?)' .
322 ' ORDER BY start_time',
329 private static function aggregateRawHelper(
int $a_begin,
int $a_end): void
345 $closed_counter = $events;
347 foreach (self::getRawData($a_begin, $a_end) as $item) {
356 if ($item[
'start_time'] >= $a_begin) {
358 $events[$item[
'start_time']][] = 1;
361 if ($item[
'end_time'] && $item[
'end_time'] <= $a_end) {
362 if (in_array($item[
'end_context'], $separate_closed,
true)) {
363 if (!isset($closed_counter[$item[
'end_context']])) {
364 $closed_counter[$item[
'end_context']] = 0;
367 $closed_counter[$item[
'end_context']]++;
369 $closed_counter[0] = ($closed_counter[0] ?? 0) + 1;
371 $events[$item[
'end_time']][] = -1;
376 $active_begin = self::getNumberOfActiveRawSessions($a_begin - 1);
377 $active_avg = $active_begin;
378 $active_max = $active_begin;
379 $active_min = $active_begin;
380 $active_end = $active_begin;
383 if (count($events)) {
384 $last_update_avg = $a_begin - 1;
385 $slot_seconds = self::SLOT_SIZE * 60;
390 foreach ($events as $ts => $actions) {
392 foreach ($actions as $action) {
404 if ($active_end > $active_max) {
405 $active_max = $active_end;
409 if ($active_end < $active_min) {
410 $active_min = $active_end;
414 $diff = $ts - $last_update_avg;
415 $active_avg += $diff / $slot_seconds * $active_end;
416 $last_update_avg = $ts;
420 if ($last_update_avg < $a_end) {
421 $diff = $a_end - $last_update_avg;
422 $active_avg += $diff / $slot_seconds * $active_end;
425 $active_avg = round($active_avg);
430 self::getAggregatedRawDataPreparedStatement(),
440 (
int) ($closed_counter[0] ?? 0),
447 private static function deleteAggregatedRaw(
int $a_now): void
455 $cut = $a_now - (60 * 60 * 24 * 7);
458 'DELETE FROM usr_session_stats_raw' .
466 public static function getNumberOfSessionsByType(
int $a_from,
int $a_to): array
473 $sql =
'SELECT SUM(opened) opened, SUM(closed_manual) closed_manual,' .
474 ' SUM(closed_expire) closed_expire,' .
475 ' SUM(closed_login) closed_login, SUM(closed_misc) closed_misc' .
476 ' FROM usr_session_stats' .
487 public static function getActiveSessions(
int $a_from,
int $a_to): array
494 $sql =
'SELECT slot_begin, slot_end, active_min, active_max, active_avg' .
495 ' FROM usr_session_stats' .
498 ' ORDER BY slot_begin';
503 $all[] = array_map(intval(...), $row);
518 $sql =
'SELECT MAX(slot_end) latest FROM usr_session_stats';
521 if ($row[
'latest'] !==
null) {
522 return (
int) $row[
'latest'];
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
static array $session_types_controlled
static getLastAggregation()
Get timestamp of last aggregation.
static ilDBStatement $raw_data_statement
static ilDBStatement $number_of_active_raw_sessions_statement
static aggregateRaw(int $a_now)
static ilDBStatement $aggregated_raw_data_statement
const int SESSION_CLOSE_LOGIN
const int SESSION_CLOSE_EXPIRE
const int SESSION_CLOSE_USER