Вход Регистрация
Файл: library/XenForo/Debug.php
Строк: 186
<?php

/**
 * Helpers for debugging output.
 *
 * @package XenForo_Core
 */
class XenForo_Debug
{
    
/**
     * Private constructor. Use statically.
     */
    
private function __construct()
    {
    }

    
/**
     * Gets the debug HTML output. This is triggered by the _debug=1 URL parameter.
     *
     * @return string
     */
    
public static function getDebugHtml()
    {
        if (
XenForo_Application::isRegistered('page_start_time'))
        {
            
$pageTime microtime(true) - XenForo_Application::get('page_start_time');
        }
        else
        {
            
$pageTime 0;
        }

        
$memoryUsage memory_get_usage();
        
$memoryUsagePeak memory_get_peak_usage();

        if (
XenForo_Application::isRegistered('db'))
        {
            
$dbDebug self::getDatabaseDebugInfo(XenForo_Application::getDb());
        }
        else
        {
            
$dbDebug = array(
                
'queryCount' => 0,
                
'totalQueryRunTime' => 0,
                
'queryHtml' => ''
            
);
        }

        if (
$pageTime 0)
        {
            
$dbPercent = ($dbDebug['totalQueryRunTime'] / $pageTime) * 100;
        }
        else
        {
            
$dbPercent 0;
        }

        
$includedFiles self::getIncludedFilesDebugInfo(get_included_files());

        
$return "<h1>Page Time: " number_format($pageTime4) . "s</h1>"
            
"<h2>Memory: " number_format($memoryUsage 1024 10244) . " MB "
            
"(Peak: " number_format($memoryUsagePeak 1024 10244) . " MB)</h2>"
            
"<h2>Queries ($dbDebug[queryCount], time: " number_format($dbDebug['totalQueryRunTime'], 4) . "s, "
            
number_format($dbPercent1) . "%)</h2>"
            
$dbDebug['queryHtml']
            . 
"<h2>Included Files ($includedFiles[includedFileCount], XenForo Classes: $includedFiles[includedXenForoClasses])</h2>"
            
$includedFiles['includedFileHtml'];

        return 
$return;
    }

    public static function 
getDebugPageWrapperHtml($debugHtml)
    {
        return <<<DEBUG
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="robots" content="noindex" />
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
    <title>XenForo Debug Output</title>
</head>
<body>
$debugHtml
</body>
</html>
DEBUG;

    }

    
/**
     * Gets database debug information, including query count and run time and
     * the actual queries that were run.
     *
     * @param Zend_Db_Adapter_Abstract $db
     *
     * @return array Keys: queryCount, totalQueryRunTime, queryHtml
     */
    
public static function getDatabaseDebugInfo(Zend_Db_Adapter_Abstract $db)
    {
        
$return = array(
            
'queryCount' => 0,
            
'totalQueryRunTime' => 0,
            
'queryHtml' => ''
        
);

        
/* @var $profiler Zend_Db_Profiler */
        
$profiler $db->getProfiler();
        
$return['queryCount'] = $profiler->getTotalNumQueries();

        if (
$return['queryCount'])
        {
            
$return['queryHtml'] .= '<ol>';

            
$queries $profiler->getQueryProfiles();
            foreach (
$queries AS $query)
            {
                
$queryText rtrim($query->getQuery());
                if (
preg_match('#(^|n)(t+)([ ]*)(?=S)#'$queryText$match))
                {
                    
$queryText preg_replace('#(^|n)t{1,' strlen($match[2]) . '}#''$1'$queryText);
                }

                
$boundParams = array();
                foreach (
$query->getQueryParams() AS $param)
                {
                    
$boundParams[] = htmlspecialchars($param);
                }

                
$explainOutput '';

                if (
preg_match('#^s*SELECTs#i'$queryText)
                    && 
in_array(get_class($db), array('Zend_Db_Adapter_Mysqli'))
                )
                {
                    
$explainQuery $db->query(
                        
'EXPLAIN ' $query->getQuery(),
                        
$query->getQueryParams()
                    );
                    
$explainRows $explainQuery->fetchAll();
                    if (
$explainRows)
                    {
                        
$explainOutput .= '<table border="1">'
                            
'<tr>'
                            
'<th>Select Type</th><th>Table</th><th>Type</th><th>Possible Keys</th>'
                            
'<th>Key</th><th>Key Len</th><th>Ref</th><th>Rows</th><th>Extra</th>'
                            
'</tr>';

                        foreach (
$explainRows AS $explainRow)
                        {
                            foreach (
$explainRow AS $key => $value)
                            {
                                if (
trim($value) === '')
                                {
                                    
$explainRow[$key] = '&nbsp;';
                                }
                                else
                                {
                                    
$explainRow[$key] = htmlspecialchars($value);
                                }
                            }

                            
$explainOutput .= '<tr>'
                                
'<td>' $explainRow['select_type'] . '</td>'
                                
'<td>' $explainRow['table'] . '</td>'
                                
'<td>' $explainRow['type'] . '</td>'
                                
'<td>' $explainRow['possible_keys'] . '</td>'
                                
'<td>' $explainRow['key'] . '</td>'
                                
'<td>' $explainRow['key_len'] . '</td>'
                                
'<td>' $explainRow['ref'] . '</td>'
                                
'<td>' $explainRow['rows'] . '</td>'
                                
'<td>' $explainRow['Extra'] . '</td>'
                                
'</tr>';
                        }

                        
$explainOutput .= '</table>';
                    }
                }

                
$return['queryHtml'] .= '<li>'
                    
'<pre>' htmlspecialchars($queryText) . '</pre>'
                    
. ($boundParams '<div><strong>Params:</strong> ' implode(', '$boundParams) . '</div>' '')
                    . 
'<div><strong>Run Time:</strong> ' number_format($query->getElapsedSecs(), 6) . '</div>'
                    
$explainOutput
                    
"</li>n";

                
$return['totalQueryRunTime'] += $query->getElapsedSecs();
            }

            
$return['queryHtml'] .= '</ol>';
        }

        return 
$return;
    }

    
/**
     * Gets included files debug info.
     *
     * @param array $includedFiles
     *
     * @return array Keys: includedFileCount, incldedFileHtml, includedForoClasses
     */
    
public static function getIncludedFilesDebugInfo(array $includedFiles)
    {
        
$return = array(
            
'includedFileCount' => count($includedFiles),
            
'includedFileHtml' => '<ol>',
            
'includedXenForoClasses' => 0
        
);

        
$baseDir dirname(reset($includedFiles));

        foreach (
$includedFiles AS $file)
        {
            
$file preg_replace('#^' preg_quote($baseDir'#') . '(\\|/)#'''$file);
            
$file htmlspecialchars($file);

            if (
preg_match('#^library(/|\\)XenForo(/|\\)#'$file))
            {
                
$return['includedXenForoClasses']++;
            }
            
$file preg_replace('#^library(/|\\)XenForo(/|\\)#''<b>$0</b>'$file);

            
$return['includedFileHtml'] .= '<li>' $file '</li>' "n";
        }
        
$return['includedFileHtml'] .= '</ol>';

        return 
$return;
    }

    public static function 
getDebugTemplateParams()
    {
        
$params = array();

        
$request = new Zend_Controller_Request_Http();
        
$pageUrl $request->getRequestUri();
        
$params['debug_url'] = $pageUrl . (strpos($pageUrl'?') !== false '&' '?') . '_debug=1';

        if (
XenForo_Application::isRegistered('page_start_time'))
        {
            
$params['page_time'] = microtime(true) - XenForo_Application::get('page_start_time');
        }

        
$params['memory_usage'] = memory_get_usage();

        if (
XenForo_Application::isRegistered('db'))
        {
            
$profiler XenForo_Application::getDb()->getProfiler();
            
$params['db_queries'] = $profiler->getTotalNumQueries();
        }

        return 
$params;
    }
}
Онлайн: 0
Реклама