public function service($name)
 {
     $start = AetherTimer::getMicroTime();
     $memcache = new Memcache();
     $memcache->connect('localhost', 11211);
     $db = Config::getDb();
     $routeSearch = new RouteSearch();
     $cacheKey = "stops_";
     $filters = array();
     if (isset($_GET['term'])) {
         $query = toLower($_GET['term']);
         $filters['search'] = new MongoRegex("/^{$query}/i");
         $cacheKey .= $query;
     } elseif (isset($_GET['lat']) && isset($_GET['long'])) {
         $lat = $_GET['lat'];
         $long = $_GET['long'];
         $regex = '/^[0-9]+\\.[0-9]*$/';
         $cacheKey .= $lat . "," . $long;
         if (preg_match($regex, $lat) && preg_match($regex, $long)) {
             $filters['location'] = array('$near' => array((double) $lat, (double) $long));
         }
     }
     if (isset($_GET['from']) && !empty($_GET['from'])) {
         $from = toLower($_GET['from']);
         $filters['connectsFrom'] = $from;
     }
     $cacheKey .= r_implode(":", $filters);
     $result = $memcache->get($cacheKey);
     if ($result) {
         $result = unserialize($result);
     } else {
         // Find stops near me!!
         $db->routes->ensureIndex(array('search' => 1));
         $filters['active'] = true;
         $stops = $db->stops->find($filters);
         $result = array('stops' => array());
         while ($stop = $stops->getNext()) {
             $result['stops'][] = array('name' => $stop['name']);
         }
         $result['generated'] = time();
         $result['length'] = count($result['stops']);
         $memcache->set($cacheKey, serialize($result), false, 7200);
     }
     $time = AetherTimer::getMicroTime() - $start;
     $result['time'] = $time;
     if (isset($_GET['callback'])) {
         return new AetherJSONPResponse($result, $_GET['callback']);
     } else {
         return new AetherJSONResponse($result);
     }
 }
 private function performSearch($searcher, $data, $timer = false)
 {
     $from = $data['from'];
     $to = $data['to'];
     $time = $data['time'];
     $offset = $data['offset'];
     $limit = $data['limit'];
     $weekday = $data['weekday'];
     $sTime = AetherTimer::getMicroTime();
     $hits = $searcher->search($from, $to, $time, $weekday, $limit, $offset, $timer);
     $timeUsed = AetherTimer::getMicroTime() - $sTime;
     $db = Config::GetDb();
     $db->log->insert(array('hits' => $searcher->count, 'from' => $from, 'to' => $to, 'time' => time(), 'date' => date("Y-m-d H:i:s"), 'timeused' => $timeUsed, 'ua' => $_SERVER['HTTP_USER_AGENT'], 'ip' => $_SERVER['REMOTE_ADDR']));
     return $hits;
 }