public function historical(){ $request = $this->getPageRequest(); $view = $this->getView(); if(!$request->isJSON()) return View::ERROR_BADREQUEST; $view->contenttype = View::CTYPE_JSON; $view->mode = View::MODE_AJAX; $view->record = false; $profiler = new \Core\Utilities\Profiler\Profiler('useractivity'); $limit = $this->_getQueryLimit(); $dstart = $request->getParameter('dstart'); $dend = $request->getParameter('dend'); if(!$dend){ $dend = Time::GetCurrent(); } else{ $dend = strtotime($dend); } if(!$dstart){ $dstart = $dend - (3600 * 24 * 30); } else{ $dstart = strtotime($dstart); } // Use FindRaw because it's faster than using full Models for everything, especially when dealing with 20k + records. $listings = UserActivityModel::FindRaw(array('datetime >= ' . $dstart, 'datetime <= ' . $dend), $limit, 'datetime DESC'); $profiler->record('Found raw models'); $data = array( 'performance' => array('get' => 0, 'post' => 0), 'requests' => array('get' => 0, 'post' => 0), 'counts' => array('bots' => 0, 'users' => 0, 'visitors' => 0), 'browsers' => array(), 'referrers' => array(), 'ips' => array(), 'os' => array(), 'notfounds' => array(), 'pages' => array(), ); $sessions = array(); $x = 0; foreach($listings as $log){ ++$x; if($log['type'] == 'GET'){ $data['performance']['get'] += $log['processing_time']; $data['requests']['get']++; } elseif($log['type'] == 'POST'){ $data['performance']['post'] += $log['processing_time']; $data['requests']['post']++; } $ua = \Core\UserAgent::Construct($log['useragent']); if($ua->isBot()){ $data['counts']['bots']++; } else{ $data['counts']['users']++; if(!isset($sessions[ $log['session_id'] ])) $sessions[ $log['session_id'] ] = true; } $browser = $ua->browser . ' ' . $ua->version; if(!isset($data['browsers'][ $browser ])) $data['browsers'][ $browser ] = 1; else $data['browsers'][ $browser ]++; if($log['referrer'] == ''){ $referrer = 'none'; } elseif(strpos($log['referrer'], 'http://' . HOST) === 0){ $referrer = 'internal'; } elseif(strpos($log['referrer'], 'https://' . HOST) === 0){ $referrer = 'internal-ssl'; } else{ // I want to trim the referrer a bit so I don't end up with a bunch of one-offs. if(($qpos = strpos($log['referrer'], '?')) !== false) $referrer = substr($log['referrer'], 0, $qpos); else $referrer = $log['referrer']; } if(!isset($data['referrers'][ $referrer ])) $data['referrers'][ $referrer ] = 1; else $data['referrers'][ $referrer ]++; if(!isset($data['ips'][ $log['ip_addr'] ])) $data['ips'][ $log['ip_addr'] ] = 1; else $data['ips'][ $log['ip_addr'] ]++; if(!isset($data['os'][ $ua->platform ])) $data['os'][ $ua->platform ] = 1; else $data['os'][ $ua->platform ]++; if($log['status'] == 404){ if(!isset($data['notfounds'][ $log['request'] ])) $data['notfounds'][ $log['request'] ] = 1; else $data['notfounds'][ $log['request'] ]++; } if($log['status'] == 200){ if(!isset($data['pages'][ $log['baseurl'] ])) $data['pages'][ $log['baseurl'] ] = 1; else $data['pages'][ $log['baseurl'] ]++; } $profiler->record('Parsed record #' . $x); } //UserAgent::Test(); die(); if($data['requests']['get'] > 0) $data['performance']['get'] = round($data['performance']['get'] / $data['requests']['get'], 2); if($data['requests']['post'] > 0) $data['performance']['post'] = $data['performance']['post'] / $data['requests']['post']; $data['counts']['visitors'] = sizeof($sessions); // Do some sorting on a few of the arrays. arsort($data['browsers']); arsort($data['referrers']); arsort($data['ips']); arsort($data['os']); arsort($data['notfounds']); arsort($data['pages']); $profiler->record('Sorted all data'); // DEBUG! //echo '<pre>'; //echo $profiler->getEventTimesFormatted(); //die(); //var_dump($data, $users, $listings); die(); $view->jsondata = $data; }
require(ROOT_PDIR . 'core/templates/halt_pages/fatal_error.inc.html'); die(); } } } //require_once(ROOT_PDIR . 'core/libs/core/ComponentHandler.class.php'); //ComponentHandler::Singleton(); // Load all the themes on the system. //require_once(ROOT_PDIR . 'core/libs/core/ThemeHandler.class.php'); //ThemeHandler::Load(); HookHandler::DispatchHook('/core/components/loaded'); $profiler->record('Components Load Complete'); /** * All the post includes, these are here for performance reasons, (they can get compiled into the compiled bootstrap) */ require_once(__DIR__ . '/bootstrap_postincludes.php'); // If the geo-location libraries are available, load the user's location! if(Core::IsComponentAvailable('geographic-codes') && class_exists('GeoIp2\\Database\\Reader')){ try{ if(REMOTE_IP == '127.0.0.1'){ // Load local connections up with Columbus, OH. // Why? ;) $geocity = 'Columbus'; $geoprovince = 'OH';