public static function fireEvent($event) { $logger = Kwf_Events_Log::getInstance(); if ($logger && $logger->indent == 0) { $logger->info('----'); $logger->resetTimer(); } $class = $event->class; $eventClass = get_class($event); $cacheId = '-ev-lst-' . Kwf_Component_Data_Root::getComponentClass() . '-' . $eventClass . '-' . $class; $callbacks = Kwf_Cache_SimpleStatic::fetch($cacheId); if ($callbacks === false) { $listeners = self::getAllListeners(); $callbacks = array(); if ($class && isset($listeners[$eventClass][$class])) { $callbacks = $listeners[$eventClass][$class]; } if (isset($listeners[$eventClass]['all'])) { $callbacks = array_merge($callbacks, $listeners[$eventClass]['all']); } Kwf_Cache_SimpleStatic::add($cacheId, $callbacks); } if ($logger) { $logger->info($event->__toString() . ':'); $logger->indent++; } static $callbackBenchmark = array(); foreach ($callbacks as $callback) { $ev = call_user_func(array($callback['class'], 'getInstance'), $callback['class'], $callback['config']); if ($logger) { $msg = '-> ' . $callback['class'] . '::' . $callback['method'] . '(' . Kwf_Debug::_btArgsString($callback['config']) . ')'; $logger->info($msg . ':'); $start = microtime(true); } $ev->{$callback['method']}($event); if ($logger) { if (!isset($callbackBenchmark[$callback['class'] . '::' . $callback['method']])) { $callbackBenchmark[$callback['class'] . '::' . $callback['method']] = array('calls' => 0, 'time' => 0); } $callbackBenchmark[$callback['class'] . '::' . $callback['method']]['calls']++; $callbackBenchmark[$callback['class'] . '::' . $callback['method']]['time'] += (microtime(true) - $start) * 1000; //ATM includes everything which is missleading } } if ($logger) { $logger->indent--; if ($logger->indent == 0) { foreach ($callbackBenchmark as $cb => $i) { $logger->info(sprintf("% 3d", $i['calls']) . "x " . sprintf("%3d", round($i['time'], 0)) . " ms: {$cb}"); } $callbackBenchmark = array(); } } self::$eventsCount++; }
private static function _countArray(&$counter, $name, $value, $backtrace = false) { if (!isset($counter[$name])) { if (!is_null($value)) { $counter[$name] = array(); } else { $counter[$name] = 0; } } if (!is_null($value)) { if (!is_array($counter[$name])) { throw new Kwf_Exception("Missing value for counter '{$name}'"); } $bt = false; if ($backtrace) { $b = debug_backtrace(); unset($b[0]); unset($b[1]); $bt = ''; foreach ($b as $i) { $bt .= (isset($i['file']) ? $i['file'] : 'Unknown file') . ':' . (isset($i['line']) ? $i['line'] : '?') . ' - ' . (isset($i['object']) && $i['object'] instanceof Kwf_Component_Data ? $i['object']->componentId . '->' : '') . (isset($i['function']) ? $i['function'] : '') . '(' . Kwf_Debug::_btArgsString($i['args']) . ')' . "<br />"; } } $counter[$name][] = array('value' => $value, 'bt' => $bt); } else { if (is_array($counter[$name])) { throw new Kwf_Exception("no value possible for counter '{$name}'"); } $counter[$name]++; } }