private static function getAvgNumber($ranges)
 {
     $timeSlicer = new TimeSlicer();
     $queue = new OnlineRangePriorityQueue();
     $onlineCount = 0;
     foreach ($ranges as $range) {
         // disconnette gli utenti
         while ($queue->valid() && $queue->current()->end < $range->start) {
             $timeSlicer->addTimePerNumUser($onlineCount, $queue->current()->end);
             $onlineCount--;
             $queue->extract();
         }
         // connette l'utente dell'intervallo
         $timeSlicer->addTimePerNumUser($onlineCount, $range->start);
         $queue->insert($range, $range->end);
         $onlineCount++;
     }
     // svuota la coda
     while ($queue->valid()) {
         $timeSlicer->addTimePerNumUser($onlineCount, $queue->current()->end);
         $onlineCount--;
         $queue->extract();
     }
     return $timeSlicer->getAverageUsers(3600 * DailyAnalyzer::$numOfWeeks);
 }
 public static function runAnalysis()
 {
     $ranges = OnlineRange::getRanges();
     usort($ranges, "OnlineRange::cmpByStart");
     $onlineCount = 0;
     $queue = new OnlineRangePriorityQueue();
     $maxOnline = 0;
     $maxOnlineTime = null;
     $timeSlicer = new TimeSlicer();
     $onlineUsers = array();
     foreach ($ranges as $range) {
         // disconnette gli utenti
         while ($queue->valid() && $queue->current()->end < $range->start) {
             $timeSlicer->addTimePerNumUser($onlineCount, $queue->current()->end);
             $onlineUsers[$queue->current()->user->client_id]--;
             if ($onlineUsers[$queue->current()->user->client_id] == 0) {
                 unset($onlineUsers[$queue->current()->user->client_id]);
             }
             $queue->extract();
         }
         // connette l'utente dell'intervallo
         $timeSlicer->addTimePerNumUser($onlineCount, $range->start);
         $queue->insert($range, $range->end);
         if (!isset($onlineUsers[$range->user->client_id])) {
             $onlineUsers[$range->user->client_id] = 0;
         }
         $onlineUsers[$range->user->client_id]++;
         $onlineCount = max($onlineCount, count($onlineUsers));
         if ($onlineCount > $maxOnline) {
             $maxOnline = $onlineCount;
             $maxOnlineTime = $range->start;
         }
     }
     // svuota la coda
     while ($queue->valid()) {
         $timeSlicer->addTimePerNumUser($onlineCount, $queue->current()->end);
         $queue->extract();
     }
     Logger::log("    Picco massimo di utenti", $maxOnline, "il", $maxOnlineTime->format('Y-m-d H:i:s'));
     OnlineAnalyzer::saveMaxPeak($maxOnline, $maxOnlineTime);
     OnlineAnalyzer::saveTimePerNum($timeSlicer->getTimePerNumUser());
 }