예제 #1
0
파일: Scalr.php 프로젝트: scalr/scalr
 /**
  * File event in database
  *
  * @param  integer $farmid
  * @param  string  $event_name
  */
 public static function FireEvent($farmid, AbstractServerEvent $event)
 {
     if (!self::$observersSetuped) {
         self::setupObservers();
     }
     $startTime = microtime(true);
     try {
         $event->SetFarmID($farmid);
         $handledObservers = array();
         // Notify class observers
         foreach (self::$EventObservers as $observer) {
             /**
              * @var $observer \EventObserver
              */
             // Skip observer if it requires agent (scalarizr), but server doesn't have it.
             if (isset($event->DBServer)) {
                 if ($observer->isScalarizrRequired && !$event->DBServer->isScalarized) {
                     continue;
                 }
             }
             $observerStartTime = microtime(true);
             $observer->SetFarmID($farmid);
             if ($event instanceof CustomEvent) {
                 call_user_func(array($observer, "OnCustomEvent"), $event);
             } else {
                 call_user_func(array($observer, "On{$event->GetName()}"), $event);
             }
             $handledObservers[substr(strrchr(get_class($observer), "\\"), 1)] = round(microtime(true) - $observerStartTime, 5);
             if (isset($event->messageLongestInsert)) {
                 $handledObservers['MessageLongestInsert'] = $event->messageLongestInsert;
             }
         }
     } catch (Exception $e) {
         self::getContainer()->logger(__CLASS__)->fatal(sprintf("Exception thrown in Scalr::FireEvent(%s:%s, %s:%s): %s", @get_class($observer), $event->GetName(), $e->getFile(), $e->getLine(), $e->getMessage()));
         throw new Exception($e->getMessage());
     }
     $event->handledObservers = $handledObservers;
     self::StoreEvent($farmid, $event, microtime(true) - $startTime);
 }