/**
  * 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;
 }
Esempio n. 2
0
 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;
 }
Esempio n. 4
0
 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);
 }
Esempio n. 6
0
 /**
  * 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()));
         }
     }
 }
Esempio n. 7
0
    /**
     * 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 .= '&nbsp;<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 . ' &raquo; ' . $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&nbsp;%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 &amp; 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 &amp; 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;
    }
Esempio n. 8
0
 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()));
         }
     }
 }
Esempio n. 9
0
 /**
  * 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);
 }
Esempio n. 10
0
<?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');
Esempio n. 11
0
 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.");
     }
 }