/** * Listens to the response.filter_content event. * * @param sfEvent $event The sfEvent instance * @param string $context The response content * * @return string The filtered response content */ public function filterResponseContent(sfEvent $event, $content) { if (!sfConfig::get('sf_web_debug')) { return $content; } // log timers information $messages = array(); foreach (sfTimerManager::getTimers() as $name => $timer) { $messages[] = sprintf('%s %.2f ms (%d)', $name, $timer->getElapsedTime() * 1000, $timer->getCalls()); } $this->dispatcher->notify(new sfEvent($this, 'application.log', $messages)); // don't add debug toolbar: // * for XHR requests // * if 304 // * if not rendering to the client // * if HTTP headers only $response = $event->getSubject(); if (!$this->context->has('request') || !$this->context->has('response') || !$this->context->has('controller') || $this->context->getRequest()->isXmlHttpRequest() || strpos($response->getContentType(), 'html') === false || $response->getStatusCode() == 304 || $this->context->getController()->getRenderMode() != sfView::RENDER_CLIENT || $response->isHeaderOnly()) { return $content; } // add needed assets for the web debug toolbar $root = $this->context->getRequest()->getRelativeUrlRoot(); $assets = sprintf(' <script type="text/javascript" src="%s"></script> <link rel="stylesheet" type="text/css" media="screen" href="%s" />', $root . sfConfig::get('sf_web_debug_web_dir') . '/js/main.js', $root . sfConfig::get('sf_web_debug_web_dir') . '/css/main.css'); $content = str_ireplace('</head>', $assets . '</head>', $content); // add web debug information to response content $webDebugContent = $this->webDebug->getResults(); $count = 0; $content = str_ireplace('</body>', $webDebugContent . '</body>', $content, $count); if (!$count) { $content .= $webDebugContent; } return $content; }
public function getPanelContent() { if (sfTimerManager::getTimers()) { $totalTime = $this->getTotalTime(); $panel = '<table class="sfWebDebugLogs" style="width: 300px"><tr><th>type</th><th>calls</th><th>time (ms)</th><th>time (%)</th></tr>'; foreach (sfTimerManager::getTimers() as $name => $timer) { $panel .= sprintf('<tr><td class="sfWebDebugLogType">%s</td><td class="sfWebDebugLogNumber" style="text-align: right">%d</td><td style="text-align: right">%.2f</td><td style="text-align: right">%d</td></tr>', $name, $timer->getCalls(), $timer->getElapsedTime() * 1000, $totalTime ? $timer->getElapsedTime() * 1000 * 100 / $totalTime : 'N/A'); } $panel .= '</table>'; return $panel; } }
public function getPanelContent() { $panel = array(); $timers = sfTimerManager::getTimers(); if (sfConfig::get('sf_debug') && $timers) { $totalTime = $this->getTotalTime(); $timer_nb = 1; foreach ($timers as $name => $timer) { array_push($panel, array('number' => $timer_nb, 'name' => $name, 'calls' => $timer->getCalls(), 'time' => $timer->getElapsedTime() * 1000, 'percent' => $totalTime ? $timer->getElapsedTime() * 1000 * 100 / $totalTime : 'N/A')); $timer_nb++; } $panel['total'] = 'Total time: ' . $this->getTotalTime() . ' ms'; } else { $panel['total'] = 'No info available'; } return $panel; }
protected function sendTimers() { $timers = sfTimerManager::getTimers(); $totalTime = $this->getTotalTime(); $panel = array(); $timer_nb = 1; foreach ($timers as $name => $timer) { array_push($panel, array('number' => $timer_nb, 'name' => $name, 'calls' => $timer->getCalls(), 'time' => $timer->getElapsedTime() * 1000, 'percent' => $totalTime ? $timer->getElapsedTime() * 1000 * 100 / $totalTime : 'N/A')); $timer_nb++; } if (count($panel)) { array_unshift($panel, array('', 'Type', 'Calls', 'Time(ms)', 'Time(%)')); $this->sfFire->table('Timers ' . $this->getTotalTime() . ' ms', $panel); } else { $this->sfFire->group('Timers ' . $this->getTotalTime() . ' ms'); $this->sfFire->info('No info available'); $this->sfFire->groupEnd(); } }
/** * Listens to the response.filter_content event. * * @param sfEvent $event The sfEvent instance * @param string $context The response content * * @return string The filtered response content */ public function filterResponseContent(sfEvent $event, $content) { // log timers information $messages = array(); foreach (sfTimerManager::getTimers() as $name => $timer) { $messages[] = sprintf('%s %.2f ms (%d)', $name, $timer->getElapsedTime() * 1000, $timer->getCalls()); } $this->dispatcher->notify(new sfEvent($this, 'application.log', $messages)); // don't add debug toolbar: // * for XHR requests // * if 304 // * if not rendering to the client // * if HTTP headers only $response = $event->getSubject(); $request = $this->context->getRequest(); if (!$this->context->has('request') || !$this->context->has('response') || !$this->context->has('controller') || $request->isXmlHttpRequest() || strpos($response->getContentType(), 'html') === false || $response->getStatusCode() == 304 || $this->context->getController()->getRenderMode() != sfView::RENDER_CLIENT || $response->isHeaderOnly()) { return $content; } $webDebug = new $this->webDebugClass($this->dispatcher, $this, array('image_root_path' => ($request->getRelativeUrlRoot() ? $request->getRelativeUrlRoot() . '/' : '') . sfConfig::get('sf_web_debug_web_dir') . '/images')); return $webDebug->injectToolbar($content); }
/** * Executes this filter. * * @param sfFilterChain The filter chain. * * @throws <b>sfInitializeException</b> If an error occurs during view initialization * @throws <b>sfViewException</b> If an error occurs while executing the view */ public function execute($filterChain) { // execute next filter $filterChain->execute(); if (sfConfig::get('sf_logging_enabled')) { $this->getContext()->getLogger()->info('{sfFilter} render to client'); } // get response object $response = $this->getContext()->getResponse(); // send headers $response->sendHttpHeaders(); // send content $response->sendContent(); // log timers information if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled')) { $logger = $this->getContext()->getLogger(); foreach (sfTimerManager::getTimers() as $name => $timer) { $logger->info(sprintf('{sfTimerManager} %s %.2f ms (%d)', $name, $timer->getElapsedTime() * 1000, $timer->getCalls())); } } }
/** * Returns the web debug toolbar as HTML. * * @return string The web debug toolbar HTML */ public function getResults() { if (!sfConfig::get('sf_web_debug')) { return ''; } $this->loadHelpers(); $result = ''; // max priority $maxPriority = ''; if (sfConfig::get('sf_logging_enabled')) { $maxPriority = $this->getPriority($this->maxPriority); } $logs = ''; $sqlLogs = array(); if (sfConfig::get('sf_logging_enabled')) { $logs = '<table class="sfWebDebugLogs"> <tr> <th>#</th> <th>type</th> <th>message</th> </tr>' . "\n"; $line_nb = 0; foreach ($this->log as $logEntry) { $log = $logEntry['message']; $priority = $this->getPriority($logEntry['priority']); if (strpos($type = $logEntry['type'], 'sf') === 0) { $type = substr($type, 2); } // xdebug information $debug_info = ''; if ($logEntry['debugStack']) { $debug_info .= ' <a href="#" onclick="sfWebDebugToggle(\'debug_' . $line_nb . '\'); return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/toggle.gif') . '</a><div class="sfWebDebugDebugInfo" id="debug_' . $line_nb . '" style="display:none">'; foreach ($logEntry['debugStack'] as $i => $logLine) { $debug_info .= '#' . $i . ' » ' . $this->formatLogLine($logLine) . '<br/>'; } $debug_info .= "</div>\n"; } // format log $log = $this->formatLogLine($log); // sql queries log if (preg_match('/execute(?:Query|Update).+?\\:\\s+(.+)$/', $log, $match)) { $sqlLogs[] .= $match[1]; } ++$line_nb; $logs .= sprintf("<tr class='sfWebDebugLogLine sfWebDebug%s %s'><td class=\"sfWebDebugLogNumber\">%s</td><td class=\"sfWebDebugLogType\">%s %s</td><td>%s%s</td></tr>\n", ucfirst($priority), $logEntry['type'], $line_nb, image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/' . $priority . '.png'), $type, $log, $debug_info); } $logs .= '</table>'; ksort($this->types); $types = array(); foreach ($this->types as $type => $nb) { $types[] = '<a href="#" onclick="sfWebDebugToggleMessages(\'' . $type . '\'); return false;">' . $type . '</a>'; } } // ignore cache link $cacheLink = ''; if (sfConfig::get('sf_debug') && sfConfig::get('sf_cache')) { $selfUrl = $_SERVER['PHP_SELF'] . (strpos($_SERVER['PHP_SELF'], '_sf_ignore_cache') === false ? '?_sf_ignore_cache=1' : ''); $cacheLink = '<li><a href="' . $selfUrl . '" title="reload and ignore cache">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/reload.png') . '</a></li>'; } // logging information $logLink = ''; if (sfConfig::get('sf_logging_enabled')) { $logLink = '<li><a href="#" onclick="sfWebDebugShowDetailsFor(\'sfWebDebugLog\'); return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/comment.png') . ' logs & msgs</a></li>'; } // database information $dbInfo = ''; $dbInfoDetails = ''; if ($sqlLogs) { $dbInfo = '<li><a href="#" onclick="sfWebDebugShowDetailsFor(\'sfWebDebugDatabaseDetails\'); return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/database.png') . ' ' . count($sqlLogs) . '</a></li>'; $dbInfoDetails = ' <div id="sfWebDebugDatabaseLogs"> <ol><li>' . implode("</li>\n<li>", $sqlLogs) . '</li></ol> </div> '; } // memory used $memoryInfo = ''; if (sfConfig::get('sf_debug') && function_exists('memory_get_usage')) { $totalMemory = sprintf('%.1f', memory_get_usage() / 1024); $memoryInfo = '<li>' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/memory.png') . ' ' . $totalMemory . ' KB</li>'; } // total time elapsed $timeInfo = ''; if (sfConfig::get('sf_debug')) { $totalTime = (microtime(true) - sfConfig::get('sf_timer_start')) * 1000; $totalTime = sprintf($totalTime <= 1 ? '%.2f' : '%.0f', $totalTime); $timeInfo = '<li class="last"><a href="#" onclick="sfWebDebugShowDetailsFor(\'sfWebDebugTimeDetails\'); return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/time.png') . ' ' . $totalTime . ' ms</a></li>'; } // timers $timeInfoDetails = '<table class="sfWebDebugLogs" style="width: 300px"><tr><th>type</th><th>calls</th><th>time (ms)</th><th>time (%)</th></tr>'; foreach (sfTimerManager::getTimers() as $name => $timer) { $timeInfoDetails .= sprintf('<tr><td class="sfWebDebugLogType">%s</td><td class="sfWebDebugLogNumber" style="text-align: right">%d</td><td style="text-align: right">%.2f</td><td style="text-align: right">%d</td></tr>', $name, $timer->getCalls(), $timer->getElapsedTime() * 1000, $timer->getElapsedTime() * 1000 * 100 / $totalTime); } $timeInfoDetails .= '</table>'; // logs $logInfo = ''; if (sfConfig::get('sf_logging_enabled')) { $logInfo .= ' <ul id="sfWebDebugLogMenu"> <li><a href="#" onclick="sfWebDebugToggleAllLogLines(true, \'sfWebDebugLogLine\'); return false;">[all]</a></li> <li><a href="#" onclick="sfWebDebugToggleAllLogLines(false, \'sfWebDebugLogLine\'); return false;">[none]</a></li> <li><a href="#" onclick="sfWebDebugShowOnlyLogLines(\'info\'); return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/info.png') . '</a></li> <li><a href="#" onclick="sfWebDebugShowOnlyLogLines(\'warning\'); return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/warning.png') . '</a></li> <li><a href="#" onclick="sfWebDebugShowOnlyLogLines(\'error\'); return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/error.png') . '</a></li> <li>' . implode("</li>\n<li>", $types) . '</li> </ul> <div id="sfWebDebugLogLines">' . $logs . '</div> '; } $result .= ' <div id="sfWebDebug"> <div id="sfWebDebugBar" class="sfWebDebug' . ucfirst($maxPriority) . '"> <a href="#" onclick="sfWebDebugToggleMenu(); return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/sf.png') . '</a> <ul id="sfWebDebugDetails" class="menu"> <li>' . SYMFONY_VERSION . '</li> <li><a href="#" onclick="sfWebDebugShowDetailsFor(\'sfWebDebugConfig\'); return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/config.png') . ' vars & config</a></li> ' . $cacheLink . ' ' . $logLink . ' ' . $dbInfo . ' ' . $memoryInfo . ' ' . $timeInfo . ' </ul> <a href="#" onclick="document.getElementById(\'sfWebDebug\').style.display=\'none\'; return false;">' . image_tag(sfConfig::get('sf_web_debug_web_dir') . '/images/close.png') . '</a> </div> <div id="sfWebDebugLog" class="sfWebDebugTop" style="display: none"><h1>Log and debug messages</h1>' . $logInfo . '</div> <div id="sfWebDebugConfig" class="sfWebDebugTop" style="display: none"><h1>Configuration and request variables</h1>' . $this->getCurrentConfigAsHtml() . '</div> <div id="sfWebDebugDatabaseDetails" class="sfWebDebugTop" style="display: none"><h1>SQL queries</h1>' . $dbInfoDetails . '</div> <div id="sfWebDebugTimeDetails" class="sfWebDebugTop" style="display: none"><h1>Timers</h1>' . $timeInfoDetails . '</div> </div> '; return $result; }
public function execute($filterChain) { $filterChain->execute(); if (sfConfig::get('sf_logging_enabled')) { $this->getContext()->getLogger()->info('{sfFilter} render to client'); } $response = $this->getContext()->getResponse(); if (method_exists($response, 'sendHttpHeaders')) { $response->sendHttpHeaders(); } $response->sendContent(); if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled')) { $logger = $this->getContext()->getLogger(); foreach (sfTimerManager::getTimers() as $name => $timer) { $logger->info(sprintf('{sfTimerManager} %s %.2f ms (%d)', $name, $timer->getElapsedTime() * 1000, $timer->getCalls())); } } }
/** * Listens to the response.filter_content event. * * @param sfEvent $event The sfEvent instance * @param string $content The response content * * @return string The filtered response content */ public function filterResponseContent(sfEvent $event, $content) { if (!sfConfig::get('sf_web_debug')) { return $content; } // log timers information $messages = array(); foreach (sfTimerManager::getTimers() as $name => $timer) { $messages[] = sprintf('%s %.2f ms (%d)', $name, $timer->getElapsedTime() * 1000, $timer->getCalls()); } $this->dispatcher->notify(new sfEvent($this, 'application.log', $messages)); // don't add debug toolbar: // * for XHR requests // * if response status code is in the 3xx range // * if not rendering to the client // * if HTTP headers only $response = $event->getSubject(); $request = $this->context->getRequest(); if (null === $this->webDebug || !$this->context->has('request') || !$this->context->has('response') || !$this->context->has('controller') || $request->isXmlHttpRequest() || strpos($response->getContentType(), 'html') === false || '3' == substr($response->getStatusCode(), 0, 1) || $this->context->getController()->getRenderMode() != sfView::RENDER_CLIENT || $response->isHeaderOnly()) { return $content; } return $this->webDebug->injectToolbar($content); }
<?php /* * This file is part of the symfony package. * (c) 2004-2006 Fabien Potencier <*****@*****.**> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ require_once __DIR__ . '/../../bootstrap/unit.php'; $t = new lime_test(6); $t->diag('sfTimer starting and stopping'); $timer = new sfTimer(); $timer->addTime(); sleep(1); $timer->addTime(); $t->is($timer->getCalls(), 2, '->getCalls() returns the amount of addTime() calls'); $t->ok($timer->getElapsedTime() > 0, '->getElapsedTime() returns a value greater than zero. No precision is tested by the unit test to avoid false alarms'); $t->diag('sfTimerManager'); $timerA = sfTimerManager::getTimer('timerA'); $timerB = sfTimerManager::getTimer('timerB'); $t->isa_ok($timerA, 'sfTimer', '::getTimer() returns an sfTimer instance'); $timers = sfTimerManager::getTimers(); $t->is(count($timers), 2, '::getTimers() returns an array with the timers created by the timer manager'); $t->is($timers['timerA'], $timerA, '::getTimers() returns an array with keys being the timer name'); sfTimerManager::clearTimers(); $t->is(count(sfTimerManager::getTimers()), 0, '::clearTimers() empties the list of the timer instances');
protected function timersGetTotal() { $timers = sfTimerManager::getTimers(); $total = 0; foreach ($timers as $timer) { $total += $timer->getElapsedTime(); } return $total; }
/** * Returns the web debug toolbar as HTML. * * @return string The web debug toolbar HTML */ public function getResults() { if (!sfConfig::get('sf_web_debug')) { return ''; } $logPanel = array(); $configPanel = $this->getCurrentConfigAsArray(); $databasePanel = array(); $memoryPanel = array(); $timersPanel = array(); $this->loadHelpers(); $result = ''; // max priority $maxPriority = ''; if (sfConfig::get('sf_logging_enabled')) { $maxPriority = $this->getPriority($this->maxPriority); } $logData = array(); //Database Information $sqlLogs = array(); if (sfConfig::get('sf_logging_enabled')) { $line_nb = 0; foreach ($this->log as $logEntry) { $log = $logEntry['message']; $priority = $this->getPriority($logEntry['priority']); // xdebug information $debug_info = array(); if (isset($logEntry['debug_stack'])) { foreach ($logEntry['debug_stack'] as $i => $logLine) { array_push($debug_info, array('line_nb' => $i, 'message' => $this->formatLogLine($logLine))); } } // format log $log = $this->formatLogLine($log); // sql queries log if (preg_match('/execute(?:Query|Update).+?\\:\\s+(.+)$/', $log, $match)) { $queryLog = trim($match[1]); preg_match('/(\\[.*\\])\\s?(.*)/', $queryLog, $queryMatches); if (count($queryMatches) > 1) { $sqlLogs[] = array('time' => isset($queryMatches[1]) ? $queryMatches[1] : '-', 'query' => isset($queryMatches[2]) ? $queryMatches[2] : '-'); } else { $sqlLogs[] = array('time' => '-', 'query' => $queryLog); } } ++$line_nb; $logData[] = array('line_nb' => $line_nb, 'priority' => $priority, 'type' => $logEntry['type'], 'message' => $log, 'debug_info' => $debug_info); } //end foreach ksort($this->types); $type_index = 0; foreach ($this->types as $t => $n) { $types[$type_index] = $t; $type_index++; } $logPanel = array('logData' => $logData, 'types' => $types); } // ignore cache link and cache info $cachePanel = array(); if (sfConfig::get('sf_debug') && sfConfig::get('sf_cache')) { $cachePanel['reload_url'] = strpos($_SERVER['PHP_SELF'], '_sf_ignore_cache') === false ? '?_sf_ignore_cache=1' : ''; $cachePanel['cache_info'] = $this->cache_info; } // memory used $memoryPanel = ''; if (sfConfig::get('sf_debug') && function_exists('memory_get_usage')) { $totalMemory = sprintf('%.1f', memory_get_usage() / 1024); $memoryPanel = $totalMemory . ' KB'; } // total time elapsed $totalTime = ''; if (sfConfig::get('sf_debug')) { $totalTime = (microtime(true) - sfConfig::get('sf_timer_start')) * 1000; $totalTime = sprintf($totalTime <= 1 ? '%.2f' : '%.0f', $totalTime); } $timersPanel = array(); //my timers $timer_nb = 1; foreach (sfTimerManager::getTimers() as $name => $timer) { $timersPanel[] = array('number' => $timer_nb, 'name' => $name, 'calls' => $timer->getCalls(), 'time' => $timer->getElapsedTime() * 1000, 'percent' => $totalTime ? $timer->getElapsedTime() * 1000 * 100 / $totalTime : 'N/A'); $timer_nb++; } $timersPanel['total'] = 'Total time: ' . $totalTime . ' ms'; $panels = array(); $panels['config'] = array('title' => 'Configuration and request variables', 'content' => $configPanel); $panels['cache'] = array('title' => 'reload and ignore cache', 'content' => $cachePanel); $panels['logs'] = array('title' => 'Logs & Messages', 'content' => $logPanel); $panels['memory'] = array('title' => 'Memory usage', 'content' => $memoryPanel); $panels['timer'] = array('title' => 'Timers', 'content' => $timersPanel); $panels['database'] = array('title' => 'Database information', 'content' => $sqlLogs); $panels['info'] = array('title' => 'Information', 'content' => $this->getInfoPanel()); if (function_exists('json_encode')) { return "<script type=\"text/javascript\"> //<![CDATA[ \n FireSymfonyDebugData = " . json_encode($panels) . "\n //]]></script>"; } else { throw new fsNoJsonException("To use FireSymfony you need to enable the json php extension."); } }