26        return (
bool) 
$ilSetting->get(
'session_statistics', 1);
 
   42    public static function createRawEntry($a_session_id, $a_session_type, $a_timestamp, $a_user_id)
 
   48        if (!$a_user_id || !$a_session_id || !self::isActive()) {
 
   56            "usr_session_stats_raw",
 
   58                "session_id" => array(
"text", $a_session_id)
 
   61                "type" => array(
"integer", $a_session_type),
 
   62                "start_time" => array(
"integer", $a_timestamp),
 
   63                "user_id" => array(
"integer", $a_user_id)
 
   75    public static function closeRawEntry($a_session_id, $a_context = 
null, $a_expired_at = 
null)
 
   81        if (!self::isActive()) {
 
   86        if (!is_array($a_session_id)) {
 
   88                $end_time = $a_expired_at;
 
   92            $sql = 
"UPDATE usr_session_stats_raw" .
 
   93                " SET end_time = " . 
$ilDB->quote($end_time, 
"integer");
 
   95                $sql .= 
",end_context = " . 
$ilDB->quote($a_context, 
"integer");
 
   97            $sql .= 
" WHERE session_id = " . 
$ilDB->quote($a_session_id, 
"text") .
 
   98                " AND end_time IS NULL";
 
   99            $ilDB->manipulate($sql);
 
  102        elseif (!$a_expired_at) {
 
  103            $sql = 
"UPDATE usr_session_stats_raw" .
 
  104                " SET end_time = " . 
$ilDB->quote(time(), 
"integer");
 
  106                $sql .= 
",end_context = " . 
$ilDB->quote($a_context, 
"integer");
 
  108            $sql .= 
" WHERE " . 
$ilDB->in(
"session_id", $a_session_id, 
false, 
"text") .
 
  109                " AND end_time IS NULL";
 
  110            $ilDB->manipulate($sql);
 
  114            foreach ($a_session_id as $id => $ts) {
 
  115                $sql = 
"UPDATE usr_session_stats_raw" .
 
  116                    " SET end_time = " . 
$ilDB->quote($ts, 
"integer");
 
  118                    $sql .= 
",end_context = " . 
$ilDB->quote($a_context, 
"integer");
 
  120                $sql .= 
" WHERE session_id = " . 
$ilDB->quote($id, 
"text") .
 
  121                    " AND end_time IS NULL";
 
  122                $ilDB->manipulate($sql);
 
  140        $sql = 
"SELECT MAX(slot_end) previous_slot_end" .
 
  141            " FROM usr_session_stats";
 
  144        $previous_slot_end = $row[
"previous_slot_end"];
 
  148        if (!$previous_slot_end) {
 
  149            $slot = floor(date(
"i") / self::SLOT_SIZE);
 
  152                $current_slot_begin = mktime(date(
"H", $a_now) - 1, 60 - self::SLOT_SIZE, 0);
 
  156                $current_slot_begin = mktime(date(
"H", $a_now), ($slot - 1) * self::SLOT_SIZE, 0);
 
  159            $current_slot_begin = $previous_slot_end + 1;
 
  165        if ($current_slot_end < $a_now) {
 
  166            return array($current_slot_begin, $current_slot_end);
 
  182        $sql = 
"SELECT COUNT(*) counter FROM usr_session_stats_raw" .
 
  183            " WHERE (end_time IS NULL OR end_time >= " . 
$ilDB->quote($a_time, 
"integer") . 
")" .
 
  184            " AND start_time <= " . 
$ilDB->quote($a_time, 
"integer") .
 
  188        return $row[
"counter"];
 
  204        $sql = 
"SELECT start_time,end_time,end_context FROM usr_session_stats_raw" .
 
  205            " WHERE start_time <= " . 
$ilDB->quote($a_end, 
"integer") .
 
  206            " AND (end_time IS NULL OR end_time >= " . 
$ilDB->quote($a_begin, 
"integer") . 
")" .
 
  208            " ORDER BY start_time";
 
  229        $ilAtomQuery = 
$ilDB->buildAtomQuery();
 
  230        $ilAtomQuery->addTableLock(
"usr_session_stats");
 
  236            if (!is_array($slot)) {
 
  243                "slot_begin" => array(
"integer", $slot[0]),
 
  244                "slot_end" => array(
"integer", $slot[1]),
 
  246            $ilDB->insert(
"usr_session_stats", $fields);
 
  261        if (!self::isActive()) {
 
  266        while (is_array($slot)) {
 
  297        $closed_counter = $events = array();
 
  299        foreach (self::getRawData($a_begin, $a_end) as $item) {
 
  308            if ($item[
"start_time"] >= $a_begin) {
 
  310                $events[$item[
"start_time"]][] = 1;
 
  313            if ($item[
"end_time"] && $item[
"end_time"] <= $a_end) {
 
  314                if (in_array($item[
"end_context"], $separate_closed)) {
 
  315                    $closed_counter[$item[
"end_context"]]++;
 
  317                    $closed_counter[0]++;
 
  319                $events[$item[
"end_time"]][] = -1;
 
  325        $active_end = $active_min = $active_max = $active_avg = $active_begin;
 
  328        if (
sizeof($events)) {
 
  329            $last_update_avg = $a_begin - 1;
 
  330            $slot_seconds = self::SLOT_SIZE * 60;
 
  335            foreach ($events as $ts => $actions) {
 
  337                foreach ($actions as $action) {
 
  349                if ($active_end > $active_max) {
 
  350                    $active_max = $active_end;
 
  354                if ($active_end < $active_min) {
 
  355                    $active_min = $active_end;
 
  359                $diff = $ts - $last_update_avg;
 
  360                $active_avg += $diff / $slot_seconds * $active_end;
 
  361                $last_update_avg = $ts;
 
  366            if ($last_update_avg < $a_end) {
 
  367                $diff = $a_end - $last_update_avg;
 
  368                $active_avg += $diff / $slot_seconds * $active_end;
 
  371            $active_avg = round($active_avg);
 
  382            "active_min" => array(
"integer", $active_min),
 
  383            "active_max" => array(
"integer", $active_max),
 
  384            "active_avg" => array(
"integer", $active_avg),
 
  385            "active_end" => array(
"integer", $active_end),
 
  386            "opened" => array(
"integer", $opened_counter),
 
  393            "closed_misc" => array(
"integer", (
int) $closed_counter[0]),
 
  394            "max_sessions" => array(
"integer", (
int) $max_sessions)
 
  399            array(
"slot_begin" => array(
"integer", $a_begin),
 
  400                "slot_end" => array(
"integer", $a_end))
 
  416        $cut = $a_now - (60 * 60 * 24 * 7);
 
  418        $ilDB->manipulate(
"DELETE FROM usr_session_stats_raw" .
 
  419            " WHERE start_time <= " . 
$ilDB->quote($cut, 
"integer"));
 
  433        $sql = 
"SELECT max(slot_end) latest FROM usr_session_stats" .
 
  434            " WHERE active_max >= max_sessions" .
 
  435            " AND max_sessions > " . 
$ilDB->quote(0, 
"integer");
 
  438        if ($row[
"latest"]) {
 
  439            return $row[
"latest"];
 
  456        $sql = 
"SELECT SUM(slot_end-slot_begin) dur FROM usr_session_stats" .
 
  457            " WHERE active_max >= max_sessions" .
 
  458            " AND max_sessions > " . 
$ilDB->quote(0, 
"integer") .
 
  459            " AND slot_end > " . 
$ilDB->quote($a_from, 
"integer") .
 
  460            " AND slot_begin < " . 
$ilDB->quote($a_to, 
"integer");
 
  481        $sql = 
"SELECT SUM(opened) opened, SUM(closed_manual) closed_manual," .
 
  482            " SUM(closed_expire) closed_expire, SUM(closed_idle) closed_idle," .
 
  483            " SUM(closed_idle_first) closed_idle_first, SUM(closed_limit) closed_limit," .
 
  484            " SUM(closed_login) closed_login, SUM(closed_misc) closed_misc" .
 
  485            " FROM usr_session_stats" .
 
  486            " WHERE slot_end > " . 
$ilDB->quote($a_from, 
"integer") .
 
  487            " AND slot_begin < " . 
$ilDB->quote($a_to, 
"integer");
 
  505        $sql = 
"SELECT slot_begin, slot_end, active_min, active_max, active_avg," .
 
  507            " FROM usr_session_stats" .
 
  508            " WHERE slot_end > " . 
$ilDB->quote($a_from, 
"integer") .
 
  509            " AND slot_begin < " . 
$ilDB->quote($a_to, 
"integer") .
 
  510            " ORDER BY slot_begin";
 
  530        $sql = 
"SELECT max(slot_end) latest FROM usr_session_stats";
 
  533        if ($row[
"latest"]) {
 
  534            return $row[
"latest"];
 
  552        $sql = 
"SELECT maxval FROM usr_session_log" .
 
  553            " WHERE tstamp <= " . 
$ilDB->quote($a_timestamp, 
"integer") .
 
  554            " ORDER BY tstamp DESC";
 
  557        if ($val[
"maxval"]) {
 
  558            return (
int) $val[
"maxval"];
 
  577        $new_value = (int) $a_new_value;
 
  580        if ($new_value != $old_value) {
 
  582                "tstamp" => array(
"timestamp", time()),
 
  583                "maxval" => array(
"integer", $new_value),
 
  584                "user_id" => array(
"integer", 
$ilUser->getId())
 
  586            $ilDB->insert(
"usr_session_log", $fields);
 
An exception for terminatinating execution or to throw for unit testing.
static $session_types_controlled
const DEFAULT_MAX_COUNT
default value for settings that have not been defined in setup or administration yet
static getActiveSessions($a_from, $a_to)
Get active sessions aggregated data.
static getLastAggregation()
Get timestamp of last aggregation.
static updateLimitLog($a_new_value)
Log max session setting.
static getMaxedOutDuration($a_from, $a_to)
Get maxed out duration in given timeframe.
static getLimitForSlot($a_timestamp)
Get max session setting for given timestamp.
static closeRawEntry($a_session_id, $a_context=null, $a_expired_at=null)
Close raw data entry.
static getCurrentSlot($a_now)
Get next slot to aggregate.
static getLastMaxedOut()
Get latest slot during which sessions were maxed out.
static aggregateRawHelper($a_begin, $a_end)
Aggregate statistics data for one slot.
static getRawData($a_begin, $a_end)
Read raw data for timespan.
static getNumberOfSessionsByType($a_from, $a_to)
Get session counters by type (opened, closed)
static deleteAggregatedRaw($a_now)
Remove already aggregated raw data.
static getNumberOfActiveRawSessions($a_time)
Count number of active sessions at given time.
static createNewAggregationSlot($a_now)
Create new slot (using table lock)
static isActive()
Is session statistics active at all?
static createRawEntry($a_session_id, $a_session_type, $a_timestamp, $a_user_id)
Create raw data entry.
static aggretateRaw($a_now)
Aggregate raw session data (older than given time)
const SESSION_CLOSE_LOGIN
const SESSION_CLOSE_FIRST
const SESSION_CLOSE_LIMIT
const SESSION_CLOSE_EXPIRE
foreach($_POST as $key=> $value) $res