Пример #1
0
 public function process()
 {
     global $wp_actions, $wp_filter;
     $this->hide_qm = (defined('QM_HIDE_SELF') and QM_HIDE_SELF);
     $this->hide_core = (defined('QM_HIDE_CORE_HOOKS') and QM_HIDE_CORE_HOOKS);
     if (is_admin() and $admin = QM_Collectors::get('admin')) {
         $this->data['screen'] = $admin->data['base'];
     } else {
         $this->data['screen'] = '';
     }
     $hooks = $all_parts = $components = array();
     if (has_filter('all')) {
         $hooks['all'] = $this->process_action('all', $wp_filter);
     }
     if (defined('QM_SHOW_ALL_HOOKS') && QM_SHOW_ALL_HOOKS) {
         // Show all hooks
         $hook_names = array_keys($wp_filter);
     } else {
         // Only show action hooks that have been called at least once
         $hook_names = array_keys($wp_actions);
     }
     foreach ($hook_names as $name) {
         $hooks[$name] = $this->process_action($name, $wp_filter);
         $all_parts = array_merge($all_parts, $hooks[$name]['parts']);
         $components = array_merge($components, $hooks[$name]['components']);
     }
     $this->data['hooks'] = $hooks;
     $this->data['parts'] = array_unique(array_filter($all_parts));
     $this->data['components'] = array_unique(array_filter($components));
 }
Пример #2
0
function register_qm_output_html_conditionals(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('conditionals')) {
        $output['conditionals'] = new QM_Output_Html_Conditionals($collector);
    }
    return $output;
}
Пример #3
0
function register_qm_output_html_theme(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('theme')) {
        $output['theme'] = new QM_Output_Html_Theme($collector);
    }
    return $output;
}
Пример #4
0
function register_qm_output_headers_overview(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('overview')) {
        $output['overview'] = new QM_Output_Headers_Overview($collector);
    }
    return $output;
}
function register_qm_output_html_languages(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('languages')) {
        $output['languages'] = new QM_Output_Html_Languages($collector);
    }
    return $output;
}
Пример #6
0
function register_qm_output_headers_redirects(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('redirects')) {
        $output['redirects'] = new QM_Output_Headers_Redirects($collector);
    }
    return $output;
}
Пример #7
0
function register_qm_output_html_admin(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('admin')) {
        $output['admin'] = new QM_Output_Html_Admin($collector);
    }
    return $output;
}
Пример #8
0
function register_qm_output_html_rewrites(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('rewrites')) {
        $output['rewrites'] = new QM_Output_Html_Rewrites($collector);
    }
    return $output;
}
Пример #9
0
function register_qm_output_html_transients(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('transients')) {
        $output['transients'] = new QM_Output_Html_Transients($collector);
    }
    return $output;
}
Пример #10
0
function register_qm_output_headers_php_errors(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('php_errors')) {
        $output['php_errors'] = new QM_Output_Headers_PHP_Errors($collector);
    }
    return $output;
}
Пример #11
0
 public function output()
 {
     $data = $this->collector->get_data();
     $db_query_num = null;
     $db_query_types = array();
     $db_queries = QM_Collectors::get('db_queries');
     if ($db_queries) {
         # @TODO: make this less derpy:
         $db_queries_data = $db_queries->get_data();
         if (isset($db_queries_data['types']) && isset($db_queries_data['total_time'])) {
             $db_query_num = $db_queries_data['types'];
         }
     }
     echo '<div class="qm" id="' . esc_attr($this->collector->id()) . '">';
     echo '<table cellspacing="0">';
     echo '<thead>';
     echo '<tr>';
     echo '<th scope="col">' . esc_html__('Page generation time', 'query-monitor') . '</th>';
     echo '<th scope="col">' . esc_html__('Peak memory usage', 'query-monitor') . '</th>';
     if (isset($db_query_num)) {
         echo '<th scope="col">' . esc_html__('Database query time', 'query-monitor') . '</th>';
         echo '<th scope="col">' . esc_html__('Database queries', 'query-monitor') . '</th>';
     }
     echo '</tr>';
     echo '</thead>';
     echo '<tbody>';
     echo '<tr>';
     echo '<td>';
     echo esc_html(number_format_i18n($data['time'], 4));
     echo '<br><span class="qm-info">';
     echo esc_html(sprintf(__('%1$s%% of %2$ss limit', 'query-monitor'), number_format_i18n($data['time_usage'], 1), number_format_i18n($data['time_limit'])));
     echo '</span>';
     echo '</td>';
     if (empty($data['memory'])) {
         echo '<td><em>' . esc_html__('Unknown', 'query-monitor') . '</em></td>';
     } else {
         echo '<td>';
         echo esc_html(sprintf(__('%s kB', 'query-monitor'), number_format_i18n($data['memory'] / 1024)));
         echo '<br><span class="qm-info">';
         echo esc_html(sprintf(__('%1$s%% of %2$s kB limit', 'query-monitor'), number_format_i18n($data['memory_usage'], 1), number_format_i18n($data['memory_limit'] / 1024)));
         echo '</span>';
         echo '</td>';
     }
     if (isset($db_query_num)) {
         echo '<td>';
         echo esc_html(number_format_i18n($db_queries_data['total_time'], 4));
         echo '</td>';
         echo '<td>';
         foreach ($db_query_num as $type_name => $type_count) {
             $db_query_types[] = sprintf('%1$s: %2$s', $type_name, number_format_i18n($type_count));
         }
         echo implode('<br>', array_map('esc_html', $db_query_types));
         echo '</td>';
     }
     echo '</tr>';
     echo '</tbody>';
     echo '</table>';
     echo '</div>';
 }
 static function register_output(array $output, QM_Collectors $collectors)
 {
     if ($collector = QM_Collectors::get('variable_checking')) {
         require_once QMCV_CLASS_DIR . 'query_monitor/output.php';
         $output['variable_checking'] = new QMCV_Output_Variable_Checking($collector);
     }
     return $output;
 }
 protected static function get_theme_data($item)
 {
     // @TODO this should be abstracted into a more general method which can be used for any of the collectors
     $theme = QM_Collectors::get('theme');
     $theme->process();
     $data = $theme->get_data();
     return $data[$item];
 }
function register_qm_output(array $output, \QM_Collectors $collectors)
{
    if ($collector = \QM_Collectors::get('flamegraph')) {
        include_once dirname(__FILE__) . '/inc/class-qm-output-html.php';
        $output['flamegraph'] = new QM_Output_Html($collector);
    }
    return $output;
}
Пример #15
0
 public function admin_menu(array $menu)
 {
     if ($dbq = QM_Collectors::get('db_queries')) {
         $dbq_data = $dbq->get_data();
         if (isset($dbq_data['component_times'])) {
             $menu[] = $this->menu(array('title' => __('Queries by Component', 'query-monitor')));
         }
     }
     return $menu;
 }
Пример #16
0
 public function admin_menu(array $menu)
 {
     if ($dbq = QM_Collectors::get('db_dupes')) {
         $dbq_data = $dbq->get_data();
         if (isset($dbq_data['dupes']) && count($dbq_data['dupes'])) {
             $menu[] = $this->menu(array('title' => esc_html(sprintf(__('Duplicate Queries (%s)', 'query-monitor'), count($dbq_data['dupes'])))));
         }
     }
     return $menu;
 }
Пример #17
0
 public function process()
 {
     if ($dbq = QM_Collectors::get('db_queries')) {
         if (isset($dbq->data['component_times'])) {
             $this->data['times'] = $dbq->data['component_times'];
             usort($this->data['times'], 'QM_Collector::sort_ltime');
         }
         if (isset($dbq->data['types'])) {
             $this->data['types'] = $dbq->data['types'];
         }
     }
 }
Пример #18
0
 public function output()
 {
     $data = $this->collector->get_data();
     $db_query_num = null;
     $db_query_types = array();
     $db_queries = QM_Collectors::get('db_queries');
     if ($db_queries) {
         # @TODO: make this less derpy:
         $db_queries_data = $db_queries->get_data();
         if (isset($db_queries_data['types'])) {
             $db_query_num = $db_queries_data['types'];
             $db_stime = number_format_i18n($db_queries_data['total_time'], 4);
         }
     }
     $total_stime = number_format_i18n($data['time'], 4);
     echo '<div class="qm" id="' . esc_attr($this->collector->id()) . '">';
     echo '<table cellspacing="0">';
     $memory_usage = '<br><span class="qm-info">' . sprintf(__('%1$s%% of %2$s kB limit', 'query-monitor'), number_format_i18n($data['memory_usage'], 1), number_format_i18n($data['memory_limit'] / 1024)) . '</span>';
     $time_usage = '<br><span class="qm-info">' . sprintf(__('%1$s%% of %2$ss limit', 'query-monitor'), number_format_i18n($data['time_usage'], 1), number_format_i18n($data['time_limit'])) . '</span>';
     echo '<thead>';
     echo '<tr>';
     echo '<th scope="col">' . __('Page generation time', 'query-monitor') . '</th>';
     echo '<th scope="col">' . __('Peak memory usage', 'query-monitor') . '</th>';
     if (isset($db_query_num)) {
         echo '<th scope="col">' . __('Database query time', 'query-monitor') . '</th>';
         echo '<th scope="col">' . __('Database queries', 'query-monitor') . '</th>';
     }
     echo '</tr>';
     echo '</thead>';
     echo '<tbody>';
     echo '<tr>';
     echo "<td>{$total_stime}{$time_usage}</td>";
     if (empty($data['memory'])) {
         echo '<td><em>' . __('Unknown', 'query-monitor') . '</em><br><span class="qm-info">' . __('Neither memory_get_peak_usage() nor memory_get_usage() are available. Speak to your host and get them to sort it out.', 'query-monitor') . '</span></td>';
     } else {
         echo '<td>' . sprintf(__('%s kB', 'query-monitor'), number_format_i18n($data['memory'] / 1024)) . $memory_usage . '</td>';
     }
     if (isset($db_query_num)) {
         echo "<td>{$db_stime}</td>";
         echo '<td>';
         foreach ($db_query_num as $type_name => $type_count) {
             $db_query_types[] = sprintf('%1$s: %2$s', $type_name, number_format_i18n($type_count));
         }
         echo implode('<br>', $db_query_types);
         echo '</td>';
     }
     echo '</tr>';
     echo '</tbody>';
     echo '</table>';
     echo '</div>';
 }
Пример #19
0
 public function process()
 {
     global $wp_version;
     $mysql_vars = array('key_buffer_size' => true, 'max_allowed_packet' => false, 'max_connections' => false, 'query_cache_limit' => true, 'query_cache_size' => true, 'query_cache_type' => 'ON');
     if ($dbq = QM_Collectors::get('db_queries')) {
         foreach ($dbq->db_objects as $id => $db) {
             $variables = $db->get_results("\n\t\t\t\t\tSHOW VARIABLES\n\t\t\t\t\tWHERE Variable_name IN ( '" . implode("', '", array_keys($mysql_vars)) . "' )\n\t\t\t\t");
             if (is_resource($db->dbh)) {
                 # Standard mysql extension
                 $driver = 'mysql';
             } else {
                 if (is_object($db->dbh)) {
                     # mysqli or PDO
                     $driver = get_class($db->dbh);
                 } else {
                     # Who knows?
                     $driver = '<span class="qm-warn">' . __('Unknown', 'query-monitor') . '</span>';
                 }
             }
             if (method_exists($db, 'db_version')) {
                 $version = $db->db_version();
             } else {
                 $version = '<span class="qm-warn">' . __('Unknown', 'query-monitor') . '</span>';
             }
             $this->data['db'][$id] = array('version' => $version, 'driver' => $driver, 'user' => $db->dbuser, 'host' => $db->dbhost, 'name' => $db->dbname, 'vars' => $mysql_vars, 'variables' => $variables);
         }
     }
     $this->data['php']['version'] = phpversion();
     $this->data['php']['user'] = self::get_current_user();
     foreach ($this->php_vars as $setting) {
         $this->data['php']['variables'][$setting]['after'] = ini_get($setting);
     }
     $this->data['php']['error_reporting'] = error_reporting();
     $this->data['wp'] = array('version' => $wp_version, 'WP_DEBUG' => self::format_bool_constant('WP_DEBUG'), 'WP_DEBUG_DISPLAY' => self::format_bool_constant('WP_DEBUG_DISPLAY'), 'WP_DEBUG_LOG' => self::format_bool_constant('WP_DEBUG_LOG'), 'SCRIPT_DEBUG' => self::format_bool_constant('SCRIPT_DEBUG'), 'WP_CACHE' => self::format_bool_constant('WP_CACHE'), 'CONCATENATE_SCRIPTS' => self::format_bool_constant('CONCATENATE_SCRIPTS'), 'COMPRESS_SCRIPTS' => self::format_bool_constant('COMPRESS_SCRIPTS'), 'COMPRESS_CSS' => self::format_bool_constant('COMPRESS_CSS'), 'WP_LOCAL_DEV' => self::format_bool_constant('WP_LOCAL_DEV'));
     if (is_multisite()) {
         $this->data['wp']['SUNRISE'] = self::format_bool_constant('SUNRISE');
     }
     $server = explode(' ', $_SERVER['SERVER_SOFTWARE']);
     $server = explode('/', reset($server));
     if (isset($server[1])) {
         $server_version = $server[1];
     } else {
         $server_version = null;
     }
     if (isset($_SERVER['SERVER_ADDR'])) {
         $address = $_SERVER['SERVER_ADDR'];
     } else {
         $address = null;
     }
     $this->data['server'] = array('name' => $server[0], 'version' => $server_version, 'address' => $address, 'host' => php_uname('n'));
 }
Пример #20
0
function register_qm_output_html_debug_bar(array $output, QM_Collectors $collectors)
{
    global $debug_bar;
    if (empty($debug_bar)) {
        return $output;
    }
    foreach ($debug_bar->panels as $panel) {
        $panel_id = strtolower(get_class($panel));
        $collector = QM_Collectors::get("debug_bar_{$panel_id}");
        if ($collector and $collector->is_visible()) {
            $output["debug_bar_{$panel_id}"] = new QM_Output_Html_Debug_Bar($collector);
        }
    }
    return $output;
}
Пример #21
0
 public function process()
 {
     global $wp_rewrite;
     if (is_admin() or QM_Util::is_async()) {
         return;
     }
     if (!($request = QM_Collectors::get('request'))) {
         return;
     }
     if (empty($wp_rewrite->rules)) {
         return;
     }
     $req = $request->data['request']['request'];
     $matching = array();
     foreach ($wp_rewrite->rules as $match => $query) {
         if (preg_match("#^{$match}#", $req)) {
             $matching[$match] = $query;
         }
     }
     $this->data['matching'] = $matching;
 }
Пример #22
0
 public function process()
 {
     global $wp_actions, $wp_filter;
     $this->hide_qm = (defined('QM_HIDE_SELF') and QM_HIDE_SELF);
     if (is_admin() and $admin = QM_Collectors::get('admin')) {
         $this->data['screen'] = $admin->data['base'];
     } else {
         $this->data['screen'] = '';
     }
     $hooks = $all_parts = $components = array();
     if (has_filter('all')) {
         $hooks['all'] = $this->process_action('all', $wp_filter);
     }
     foreach ($wp_actions as $name => $count) {
         $hooks[$name] = $this->process_action($name, $wp_filter);
         $all_parts = array_merge($all_parts, $hooks[$name]['parts']);
         $components = array_merge($components, $hooks[$name]['components']);
     }
     $this->data['hooks'] = $hooks;
     $this->data['parts'] = array_unique(array_filter($all_parts));
     $this->data['components'] = array_unique(array_filter($components));
 }
function register_qm_output_html_environment(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('environment')) {
        $output['environment'] = new QM_Output_Html_Environment($collector);
    }
    return $output;
}
Пример #24
0
 public function process()
 {
     global $wp_version;
     $mysql_vars = array('key_buffer_size' => true, 'max_allowed_packet' => false, 'max_connections' => false, 'query_cache_limit' => true, 'query_cache_size' => true, 'query_cache_type' => 'ON');
     if ($dbq = QM_Collectors::get('db_queries')) {
         foreach ($dbq->db_objects as $id => $db) {
             $variables = $db->get_results("\n\t\t\t\t\tSHOW VARIABLES\n\t\t\t\t\tWHERE Variable_name IN ( '" . implode("', '", array_keys($mysql_vars)) . "' )\n\t\t\t\t");
             if (is_resource($db->dbh)) {
                 # Old mysql extension
                 $extension = 'mysql';
             } else {
                 if (is_object($db->dbh)) {
                     # mysqli or PDO
                     $extension = get_class($db->dbh);
                 } else {
                     # Who knows?
                     $extension = null;
                 }
             }
             if (method_exists($db, 'db_version')) {
                 $server = $db->db_version();
             } else {
                 $server = null;
             }
             if (isset($db->use_mysqli) && $db->use_mysqli) {
                 $client = mysqli_get_client_version();
             } else {
                 if (preg_match('|[0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2}|', mysql_get_client_info(), $matches)) {
                     $client = $matches[0];
                 } else {
                     $client = null;
                 }
             }
             if ($client) {
                 $client_version = implode('.', QM_Util::get_client_version($client));
                 $client_version = sprintf('%s (%s)', $client, $client_version);
             } else {
                 $client_version = null;
             }
             $info = array('extension' => $extension, 'server version' => $server, 'client version' => $client_version, 'user' => $db->dbuser, 'host' => $db->dbhost, 'database' => $db->dbname);
             $this->data['db'][$id] = array('info' => $info, 'vars' => $mysql_vars, 'variables' => $variables);
         }
     }
     $this->data['php']['version'] = phpversion();
     $this->data['php']['sapi'] = php_sapi_name();
     $this->data['php']['user'] = self::get_current_user();
     if (defined('HHVM_VERSION')) {
         $this->data['php']['hhvm'] = HHVM_VERSION;
     }
     foreach ($this->php_vars as $setting) {
         $this->data['php']['variables'][$setting]['after'] = ini_get($setting);
     }
     $this->data['php']['error_reporting'] = error_reporting();
     $this->data['wp'] = array('version' => $wp_version, 'WP_DEBUG' => self::format_bool_constant('WP_DEBUG'), 'WP_DEBUG_DISPLAY' => self::format_bool_constant('WP_DEBUG_DISPLAY'), 'WP_DEBUG_LOG' => self::format_bool_constant('WP_DEBUG_LOG'), 'SCRIPT_DEBUG' => self::format_bool_constant('SCRIPT_DEBUG'), 'WP_CACHE' => self::format_bool_constant('WP_CACHE'), 'CONCATENATE_SCRIPTS' => self::format_bool_constant('CONCATENATE_SCRIPTS'), 'COMPRESS_SCRIPTS' => self::format_bool_constant('COMPRESS_SCRIPTS'), 'COMPRESS_CSS' => self::format_bool_constant('COMPRESS_CSS'), 'WP_LOCAL_DEV' => self::format_bool_constant('WP_LOCAL_DEV'));
     if (is_multisite()) {
         $this->data['wp']['SUNRISE'] = self::format_bool_constant('SUNRISE');
     }
     $server = explode(' ', $_SERVER['SERVER_SOFTWARE']);
     $server = explode('/', reset($server));
     if (isset($server[1])) {
         $server_version = $server[1];
     } else {
         $server_version = null;
     }
     if (isset($_SERVER['SERVER_ADDR'])) {
         $address = $_SERVER['SERVER_ADDR'];
     } else {
         $address = null;
     }
     $this->data['server'] = array('name' => $server[0], 'version' => $server_version, 'address' => $address, 'host' => php_uname('n'));
 }
Пример #25
0
function register_qm_output_html_http(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('http')) {
        $output['http'] = new QM_Output_Html_HTTP($collector);
    }
    return $output;
}
Пример #26
0
function register_qm_output_html_db_queries(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('db_queries')) {
        $output['db_queries'] = new QM_Output_Html_DB_Queries($collector);
    }
    return $output;
}
Пример #27
0
function register_qm_output_html_assets(array $output, QM_Collectors $collectors)
{
    if ($collector = QM_Collectors::get('assets')) {
        $output['assets'] = new QM_Output_Html_Assets($collector);
    }
    return $output;
}
Пример #28
0
 public function process()
 {
     if (!($dbq = QM_Collectors::get('db_queries'))) {
         return;
     }
     if (!isset($dbq->data['dupes'])) {
         return;
     }
     // Filter out SQL queries that do not have dupes
     $this->data['dupes'] = array_filter($dbq->data['dupes'], array($this, '_filter_dupe_queries'));
     // Ignore dupes from `WP_Query->set_found_posts()`
     unset($this->data['dupes']['SELECT FOUND_ROWS()']);
     $stacks = array();
     $tops = array();
     $callers = array();
     $components = array();
     // Loop over all SQL queries that have dupes
     foreach ($this->data['dupes'] as $sql => $query_ids) {
         // Loop over each query
         foreach ($query_ids as $query_id) {
             if (isset($dbq->data['dbs']['$wpdb']->rows[$query_id]['trace'])) {
                 $trace = $dbq->data['dbs']['$wpdb']->rows[$query_id]['trace'];
                 $stack = wp_list_pluck($trace->get_filtered_trace(), 'id');
                 $component = $trace->get_component();
                 // Populate the component counts for this query
                 if (isset($components[$sql][$component->name])) {
                     $components[$sql][$component->name]++;
                 } else {
                     $components[$sql][$component->name] = 1;
                 }
             } else {
                 $stack = array_reverse(explode(', ', $dbq->data['dbs']['$wpdb']->rows[$query_id]['stack']));
             }
             // Populate the caller counts for this query
             if (isset($callers[$sql][$stack[0]])) {
                 $callers[$sql][$stack[0]]++;
             } else {
                 $callers[$sql][$stack[0]] = 1;
             }
             // Populate the stack for this query
             $stacks[$sql][] = $stack;
         }
         // Get the callers which are common to all stacks for this query
         $common = call_user_func_array('array_intersect', $stacks[$sql]);
         // Remove callers which are common to all stacks for this query
         foreach ($stacks[$sql] as $i => $stack) {
             $stacks[$sql][$i] = array_values(array_diff($stack, $common));
             // No uncommon callers within the stack? Just use the topmost caller.
             if (empty($stacks[$sql][$i])) {
                 $stacks[$sql][$i] = array_keys($callers[$sql]);
             }
         }
         // Wave a magic wand
         $sources[$sql] = array_count_values(wp_list_pluck($stacks[$sql], 0));
     }
     if (!empty($sources)) {
         $this->data['dupe_sources'] = $sources;
         $this->data['dupe_callers'] = $callers;
         $this->data['dupe_components'] = $components;
     }
 }