|
|
|
|
@ -1658,34 +1658,62 @@ class Tracking |
|
|
|
|
*/ |
|
|
|
|
public static function get_course_connections_count($courseId, $session_id = 0, $start = 0, $stop = null) |
|
|
|
|
{ |
|
|
|
|
if ($start < 0) { |
|
|
|
|
if ($start < 0) { |
|
|
|
|
$start = 0; |
|
|
|
|
} |
|
|
|
|
if (!isset($stop) or ($stop < 0)) { |
|
|
|
|
$stop = api_get_utc_datetime(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$start = Database::escape_string($start); |
|
|
|
|
$stop = Database::escape_string($stop); |
|
|
|
|
// Given we're storing in cache, round the start and end times |
|
|
|
|
// to the lower minute |
|
|
|
|
$roundedStart = substr($start, 0, -2) . '00'; |
|
|
|
|
$roundedStop = substr($stop, 0, -2) . '00'; |
|
|
|
|
$roundedStart = Database::escape_string($roundedStart); |
|
|
|
|
$roundedStop = Database::escape_string($roundedStop); |
|
|
|
|
|
|
|
|
|
$month_filter = " AND login_course_date > '$start' AND login_course_date < '$stop' "; |
|
|
|
|
$month_filter = " AND login_course_date > '$roundedStart' AND login_course_date < '$roundedStop' "; |
|
|
|
|
|
|
|
|
|
$courseId = intval($courseId); |
|
|
|
|
$session_id = intval($session_id); |
|
|
|
|
$count = 0; |
|
|
|
|
|
|
|
|
|
$tbl_track_e_course_access = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); |
|
|
|
|
$sql = "SELECT count(*) as count_connections |
|
|
|
|
$tbl_track_e_course_access = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); |
|
|
|
|
$sql = "SELECT count(*) as count_connections |
|
|
|
|
FROM $tbl_track_e_course_access |
|
|
|
|
WHERE |
|
|
|
|
c_id = $courseId AND |
|
|
|
|
session_id = $session_id |
|
|
|
|
$month_filter"; |
|
|
|
|
$rs = Database::query($sql); |
|
|
|
|
if (Database::num_rows($rs)>0) { |
|
|
|
|
$row = Database::fetch_object($rs); |
|
|
|
|
$count = $row->count_connections; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//This query can be very slow (several seconds on an indexed table |
|
|
|
|
// with 14M rows). As such, we'll try to use APCU if it is |
|
|
|
|
// available to store the resulting value for a few seconds |
|
|
|
|
$cacheEnabled = function_exists('apcu_exists'); |
|
|
|
|
if ($cacheEnabled) { |
|
|
|
|
$apc = apcu_cache_info(true); |
|
|
|
|
$apc_end = $apc['start_time'] + $apc['ttl']; |
|
|
|
|
|
|
|
|
|
$apc_var = 'course_access_'.$courseId.'_'.$session_id.'_'.strtotime($roundedStart).'_'.strtotime($roundedStop); |
|
|
|
|
if (apcu_exists($apc_var) && (time() < $apc_end) && |
|
|
|
|
apcu_fetch($apc_var) > 0 |
|
|
|
|
) { |
|
|
|
|
$count = apcu_fetch($apc_var); |
|
|
|
|
} else { |
|
|
|
|
$rs = Database::query($sql); |
|
|
|
|
if (Database::num_rows($rs)>0) { |
|
|
|
|
$row = Database::fetch_object($rs); |
|
|
|
|
$count = $row->count_connections; |
|
|
|
|
} |
|
|
|
|
apcu_clear_cache(); |
|
|
|
|
apcu_store($apc_var, $count, 60); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
$rs = Database::query($sql); |
|
|
|
|
if (Database::num_rows($rs)>0) { |
|
|
|
|
$row = Database::fetch_object($rs); |
|
|
|
|
$count = $row->count_connections; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $count; |
|
|
|
|
} |
|
|
|
|
|