diff --git a/composer.json b/composer.json index f21bf25..20d350c 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,6 @@ "authors" : [ { "name" : "Andrey Savchenko", - "email" : "contact@rarst.net", "homepage": "http://www.Rarst.net/" } ], @@ -16,7 +15,9 @@ "issues": "https://github.com/Rarst/laps/issues" }, "autoload" : { - "classmap": ["src/"] + "psr-4": { + "Rarst\\Laps\\" : "src/" + } }, "require" : { "composer/installers": "~1.0", diff --git a/src/class-core-events.php b/src/Core_Events.php similarity index 95% rename from src/class-core-events.php rename to src/Core_Events.php index d02238e..7aaaa29 100644 --- a/src/class-core-events.php +++ b/src/Core_Events.php @@ -1,106 +1,106 @@ - 'stop', - 'event' => 'Plugins Load', - 'category' => 'plugin', - ); - - $stops['plugins_loaded'][ - 1 ] = array( - 'event' => 'Plugins Loaded Hook', - 'category' => 'plugin', - ); - - $stops['plugins_loaded'][20] = array( - 'action' => 'stop', - 'event' => 'Plugins Loaded Hook', - 'category' => 'plugin', - ); - - $stops['setup_theme'][0] = array( - 'event' => 'Themes Load', - 'category' => 'theme', - ); - - $stops['after_setup_theme'][20] = array( - 'action' => 'stop', - 'event' => 'Themes Load', - 'category' => 'theme', - ); - - $stops['init'][- 1] = array( - 'event' => 'Core Init', - 'category' => 'core', - ); - - $stops['wp_loaded'][20] = array( - 'action' => 'stop', - 'event' => 'Core Init', - 'category' => 'core', - ); - - $stops['admin_init'][- 1] = array( - 'event' => 'Core Admin Init', - 'category' => 'core', - ); - - $stops['admin_init'][ PHP_INT_MAX -1 ] = array( - 'action' => 'stop', - 'event' => 'Core Admin Init', - 'category' => 'core', - ); - - $stops['_admin_menu'][- 1] = array( - 'event' => 'Admin Menu', - 'category' => 'core', - ); - $stops['admin_menu'][ PHP_INT_MAX -1 ] = array( - 'action' => 'stop', - 'event' => 'Admin Menu', - 'category' => 'core', - ); - - $stops['admin_bar_menu'][-1] = array( - 'event' => 'Toolbar', - 'category' => 'core', - ); - - $stops['loop_start'][10] = array( - 'event' => 'Main Loop', - 'category' => 'theme', - ); - - $stops['loop_end'][10] = array( - 'action' => 'stop', - 'event' => 'Main Loop', - 'category' => 'theme', - ); - - $stops['admin_enqueue_scripts'][10] = array( - 'event' => 'Admin Print Scripts', - 'category' => 'core', - ); - - $stops['admin_print_scripts'][10] = array( - 'action' => 'stop', - 'event' => 'Admin Print Scripts', - 'category' => 'core', - ); - - return $stops; - } -} + 'stop', + 'event' => 'Plugins Load', + 'category' => 'plugin', + ); + + $stops['plugins_loaded'][ - 1 ] = array( + 'event' => 'Plugins Loaded Hook', + 'category' => 'plugin', + ); + + $stops['plugins_loaded'][20] = array( + 'action' => 'stop', + 'event' => 'Plugins Loaded Hook', + 'category' => 'plugin', + ); + + $stops['setup_theme'][0] = array( + 'event' => 'Themes Load', + 'category' => 'theme', + ); + + $stops['after_setup_theme'][20] = array( + 'action' => 'stop', + 'event' => 'Themes Load', + 'category' => 'theme', + ); + + $stops['init'][- 1] = array( + 'event' => 'Core Init', + 'category' => 'core', + ); + + $stops['wp_loaded'][20] = array( + 'action' => 'stop', + 'event' => 'Core Init', + 'category' => 'core', + ); + + $stops['admin_init'][- 1] = array( + 'event' => 'Core Admin Init', + 'category' => 'core', + ); + + $stops['admin_init'][ PHP_INT_MAX -1 ] = array( + 'action' => 'stop', + 'event' => 'Core Admin Init', + 'category' => 'core', + ); + + $stops['_admin_menu'][- 1] = array( + 'event' => 'Admin Menu', + 'category' => 'core', + ); + $stops['admin_menu'][ PHP_INT_MAX -1 ] = array( + 'action' => 'stop', + 'event' => 'Admin Menu', + 'category' => 'core', + ); + + $stops['admin_bar_menu'][-1] = array( + 'event' => 'Toolbar', + 'category' => 'core', + ); + + $stops['loop_start'][10] = array( + 'event' => 'Main Loop', + 'category' => 'theme', + ); + + $stops['loop_end'][10] = array( + 'action' => 'stop', + 'event' => 'Main Loop', + 'category' => 'theme', + ); + + $stops['admin_enqueue_scripts'][10] = array( + 'event' => 'Admin Print Scripts', + 'category' => 'core', + ); + + $stops['admin_print_scripts'][10] = array( + 'action' => 'stop', + 'event' => 'Admin Print Scripts', + 'category' => 'core', + ); + + return $stops; + } +} diff --git a/src/class-genesis-events.php b/src/Genesis_Events.php similarity index 95% rename from src/class-genesis-events.php rename to src/Genesis_Events.php index c5c7de1..c3f9470 100644 --- a/src/class-genesis-events.php +++ b/src/Genesis_Events.php @@ -1,62 +1,62 @@ - 'Header', - 'category' => 'theme', - ); - - $events['genesis_after_header'][10] = array( - 'action' => 'stop', - 'event' => 'Header', - 'category' => 'theme', - ); - - $events['genesis_before_sidebar_widget_area'][10] = array( - 'event' => 'Sidebar', - 'category' => 'theme', - ); - - $events['genesis_after_sidebar_widget_area'][10] = array( - 'action' => 'stop', - 'event' => 'Sidebar', - 'category' => 'theme', - ); - - $events['genesis_before_sidebar_alt_widget_area'][10] = array( - 'event' => 'Sidebar (alternate)', - 'category' => 'theme', - ); - - $events['genesis_after_sidebar_alt_widget_area'][10] = array( - 'action' => 'stop', - 'event' => 'Sidebar (alternate)', - 'category' => 'theme', - ); - - return $events; - } -} + 'Header', + 'category' => 'theme', + ); + + $events['genesis_after_header'][10] = array( + 'action' => 'stop', + 'event' => 'Header', + 'category' => 'theme', + ); + + $events['genesis_before_sidebar_widget_area'][10] = array( + 'event' => 'Sidebar', + 'category' => 'theme', + ); + + $events['genesis_after_sidebar_widget_area'][10] = array( + 'action' => 'stop', + 'event' => 'Sidebar', + 'category' => 'theme', + ); + + $events['genesis_before_sidebar_alt_widget_area'][10] = array( + 'event' => 'Sidebar (alternate)', + 'category' => 'theme', + ); + + $events['genesis_after_sidebar_alt_widget_area'][10] = array( + 'action' => 'stop', + 'event' => 'Sidebar (alternate)', + 'category' => 'theme', + ); + + return $events; + } +} diff --git a/src/class-hybrid-events.php b/src/Hybrid_Events.php similarity index 95% rename from src/class-hybrid-events.php rename to src/Hybrid_Events.php index 9ba339f..cb82b3b 100644 --- a/src/class-hybrid-events.php +++ b/src/Hybrid_Events.php @@ -1,59 +1,59 @@ - 'Header', - 'category' => 'theme', - ); - - $events["{$prefix}_after_header"][10] = array( - 'action' => 'stop', - 'event' => 'Header', - 'category' => 'theme', - ); - - $sidebars = get_theme_support( 'hybrid-core-sidebars' ); - - if ( ! empty( $sidebars[0] ) ) { - foreach ( $sidebars[0] as $sidebar ) { - - $events["{$prefix}_before_{$sidebar}"][10] = array( - 'event' => "Sidebar ({$sidebar})", - 'category' => 'theme', - ); - - $events["{$prefix}_after_{$sidebar}"][10] = array( - 'action' => 'stop', - 'event' => "Sidebar ({$sidebar})", - 'category' => 'theme', - ); - } - } - - return $events; - } -} + 'Header', + 'category' => 'theme', + ); + + $events["{$prefix}_after_header"][10] = array( + 'action' => 'stop', + 'event' => 'Header', + 'category' => 'theme', + ); + + $sidebars = get_theme_support( 'hybrid-core-sidebars' ); + + if ( ! empty( $sidebars[0] ) ) { + foreach ( $sidebars[0] as $sidebar ) { + + $events["{$prefix}_before_{$sidebar}"][10] = array( + 'event' => "Sidebar ({$sidebar})", + 'category' => 'theme', + ); + + $events["{$prefix}_after_{$sidebar}"][10] = array( + 'action' => 'stop', + 'event' => "Sidebar ({$sidebar})", + 'category' => 'theme', + ); + } + } + + return $events; + } +} diff --git a/src/class-laps.php b/src/Laps.php similarity index 96% rename from src/class-laps.php rename to src/Laps.php index 6d38caf..bb5ec34 100644 --- a/src/class-laps.php +++ b/src/Laps.php @@ -1,318 +1,318 @@ -start( 'Plugins Load', 'plugin' ); - $events = new Core_Events(); - self::add_events( $events->get() ); - - add_action( 'pre_update_option_active_plugins', array( __CLASS__, 'pre_update_option_active_plugins' ) ); - add_action( 'pre_update_site_option_active_sitewide_plugins', array( __CLASS__, 'pre_update_option_active_plugins' ) ); - add_action( 'pre_http_request', array( __CLASS__, 'pre_http_request' ), 10, 3 ); - add_action( 'http_api_debug', array( __CLASS__, 'http_api_debug' ), 10, 5 ); - add_action( 'after_setup_theme', array( __CLASS__, 'after_setup_theme' ), 15 ); - add_action( 'init', array( __CLASS__, 'init' ) ); - - if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) { - add_filter( 'query', array( __CLASS__, 'query' ), 20 ); - } - } - - /** - * Hook events by name and priority from array. - * - * @param array $stops - */ - public static function add_events( $stops ) { - - self::$events = array_merge( self::$events, $stops ); - - foreach ( $stops as $hook_name => $data ) { - - foreach ( array_keys( $data ) as $priority ) { - - add_action( $hook_name, array( __CLASS__, 'tick' ), $priority ); - } - } - } - - /** - * Reorder active plugins so Laps is first and starts timing load early. - * - * @param array $plugins - * - * @return array - */ - public static function pre_update_option_active_plugins( $plugins ) { - - $plugin = plugin_basename( dirname( __DIR__ ) . '/laps.php' ); - $key = array_search( $plugin, $plugins ); - - if ( false !== $key && $key > 0 ) { - - unset( $plugins[ $key ] ); - array_unshift( $plugins, $plugin ); - $plugins = array_values( $plugins ); - } - - return $plugins; - } - - /** - * Mark action for the event on Stopwatch. - * - * @param mixed $input pass through if added to filter - * - * @return mixed - */ - public static function tick( $input = null ) { - - global $wp_filter; - - $filter_name = current_filter(); - $filter_instance = $wp_filter[ $filter_name ]; - $priority = $filter_instance instanceof \WP_Hook ? $filter_instance->current_priority() : key( $filter_instance ); - - // See https://core.trac.wordpress.org/ticket/41185 on broken priority, but more general sanity check. - if ( empty( self::$events[ $filter_name ][ $priority ] ) ) { - return $input; - } - - $event = wp_parse_args( - self::$events[ $filter_name ][ $priority ], - array( - 'action' => 'start', - 'category' => null, - ) - ); - - if ( 'stop' === $event['action'] && ! self::$stopwatch->isStarted( $event['event'] ) ) { - return $input; - } - - self::$stopwatch->{$event['action']}( $event['event'], $event['category'] ); - - return $input; - } - - /** - * Capture SQL queries start times - * - * @param string $query - * - * @return string - */ - public static function query( $query ) { - - global $wpdb; - - if ( empty( self::$query_starts ) && ! empty( $wpdb->queries ) ) { - self::$query_starts[ count( $wpdb->queries ) ] = microtime( true ) * 1000; - } else { - self::$query_starts[] = microtime( true ) * 1000; - } - - return $query; - } - - /** - * Capture start time of HTTP request - * - * @param boolean $false - * @param array $args - * @param string $url - * - * @return boolean - */ - public static function pre_http_request( $false, $args, $url ) { - - self::$stopwatch->start( $url, 'http' ); - - return $false; - } - - /** - * Capture end time of HTTP request - * - * @param array|\WP_Error $response - * @param string $type - * @param object $class - * @param array $args - * @param string $url - * - * @return mixed - */ - public static function http_api_debug( $response, $type, $class, $args, $url ) { - - self::$stopwatch->stop( $url ); - - return $response; - } - - /** - * When theme is done possibly add vendor-specific events. - */ - public static function after_setup_theme() { - - foreach ( array( 'THA', 'Hybrid', 'Genesis', 'Thematic', 'Yoast' ) as $vendor ) { - - $class = "Rarst\\Laps\\{$vendor}_Events"; - /** @var Laps_Events $events */ - $events = new $class; - self::add_events( $events->get() ); - } - } - - public static function init() { - - add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) ); - add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) ); - add_action( 'admin_bar_menu', array( __CLASS__, 'admin_bar_menu' ), 100 ); - } - - public static function enqueue_scripts() { - - $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; - wp_register_script( 'laps', plugins_url( "js/laps{$suffix}.js", __DIR__ ), array( 'jquery' ), '3.3.1', true ); - wp_register_style( 'laps', plugins_url( "css/laps{$suffix}.css", __DIR__ ) ); - - if ( is_admin_bar_showing() ) { - wp_enqueue_script( 'laps' ); - wp_enqueue_style( 'laps' ); - } - } - - /** - * Render interface and add to the toolbar. - * - * @param \WP_Admin_Bar $wp_admin_bar - */ - public static function admin_bar_menu( $wp_admin_bar ) { - - if ( ! apply_filters( 'laps_can_see', current_user_can( 'manage_options' ) ) ) { - return; - } - - global $timestart, $wpdb; - - $mustache = new \Mustache_Engine( - array( - 'loader' => new \Mustache_Loader_FilesystemLoader( dirname( __DIR__ ) . '/views' ), - 'cache' => new Mustache_Cache_FrozenCache( dirname( __DIR__ ) . '/views/cache' ), - ) - ); - - if ( self::$stopwatch->isStarted( 'Toolbar' ) ) { - self::$stopwatch->stop( 'Toolbar' ); - } - - $events = self::$stopwatch->getSectionEvents( '__root__' ); - $start = $timestart * 1000; - $end = microtime( true ) * 1000; - $total = $end - $start; - $event_data = array(); - $http_data = array(); - - foreach ( $events as $name => $event ) { - - $offset = round( ( $event->getOrigin() - $start ) / $total * 100, 2 ); - $duration = $event->getDuration(); - $width = round( $duration / $total * 100, 2 ); - $category = $event->getCategory(); - - if ( 'http' === $category ) { - $http_data[] = compact( 'name', 'offset', 'duration', 'width', 'category' ); - continue; - } - - $memory = $event->getMemory() / 1024 / 1024; - - $event_data[] = compact( 'name', 'offset', 'duration', 'width', 'category', 'memory' ); - } - - $query_data = array(); - $last_query_end = 0; - $last_offset = 0; - $last_duration = 0; - - if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) { - - foreach ( $wpdb->queries as $key => $query ) { - $query_start = isset( self::$query_starts[ $key ] ) ? self::$query_starts[ $key ] : $last_query_end; - list( $sql, $duration, $trace ) = $query; - $sql = trim( $sql ); - $category = 'query-read'; - - if ( 0 === stripos( $sql, 'INSERT' ) || 0 === stripos( $sql, 'UPDATE' ) ) { - $category = 'query-write'; - } - - $duration *= 1000; - $last_query_end = $query_start + $duration; - $offset = round( ( $query_start - $start ) / $total * 100, 2 ); - - // if query is indistinguishably close to previous then stack it - if ( $offset === $last_offset ) { - $key = count( $query_data ) - 1; - $query_data[ $key ]['sql'] .= '
' . $sql; - - $last_duration += $duration; - $width = round( $last_duration / $total * 100, 2 ); - $query_data[ $key ]['width'] = $width; - - continue; - } - - $width = round( $duration / $total * 100, 2 ); - $last_offset = $offset; - $last_duration = $duration; - - $query_data[] = compact( 'sql', 'duration', 'offset', 'width', 'category' ); - } - } - - $html = $mustache->render( - 'laps', - array( - 'events' => $event_data, - 'queries' => $query_data, - 'savequeries' => defined( 'SAVEQUERIES' ) && SAVEQUERIES, - 'http' => $http_data, - 'savehttp' => ! empty( $http_data ), - ) - ); - - $wp_admin_bar->add_node( array( - 'id' => 'laps', - 'title' => sprintf( 'Lap: %ss', round( $total / 1000, 3 ) ), - ) ); - - $wp_admin_bar->add_node( array( - 'id' => 'laps_output', - 'parent' => 'laps', - 'meta' => array( 'html' => $html ), - ) ); - } -} +start( 'Plugins Load', 'plugin' ); + $events = new Core_Events(); + self::add_events( $events->get() ); + + add_action( 'pre_update_option_active_plugins', array( __CLASS__, 'pre_update_option_active_plugins' ) ); + add_action( 'pre_update_site_option_active_sitewide_plugins', array( __CLASS__, 'pre_update_option_active_plugins' ) ); + add_action( 'pre_http_request', array( __CLASS__, 'pre_http_request' ), 10, 3 ); + add_action( 'http_api_debug', array( __CLASS__, 'http_api_debug' ), 10, 5 ); + add_action( 'after_setup_theme', array( __CLASS__, 'after_setup_theme' ), 15 ); + add_action( 'init', array( __CLASS__, 'init' ) ); + + if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) { + add_filter( 'query', array( __CLASS__, 'query' ), 20 ); + } + } + + /** + * Hook events by name and priority from array. + * + * @param array $stops + */ + public static function add_events( $stops ) { + + self::$events = array_merge( self::$events, $stops ); + + foreach ( $stops as $hook_name => $data ) { + + foreach ( array_keys( $data ) as $priority ) { + + add_action( $hook_name, array( __CLASS__, 'tick' ), $priority ); + } + } + } + + /** + * Reorder active plugins so Laps is first and starts timing load early. + * + * @param array $plugins + * + * @return array + */ + public static function pre_update_option_active_plugins( $plugins ) { + + $plugin = plugin_basename( dirname( __DIR__ ) . '/laps.php' ); + $key = array_search( $plugin, $plugins ); + + if ( false !== $key && $key > 0 ) { + + unset( $plugins[ $key ] ); + array_unshift( $plugins, $plugin ); + $plugins = array_values( $plugins ); + } + + return $plugins; + } + + /** + * Mark action for the event on Stopwatch. + * + * @param mixed $input pass through if added to filter + * + * @return mixed + */ + public static function tick( $input = null ) { + + global $wp_filter; + + $filter_name = current_filter(); + $filter_instance = $wp_filter[ $filter_name ]; + $priority = $filter_instance instanceof \WP_Hook ? $filter_instance->current_priority() : key( $filter_instance ); + + // See https://core.trac.wordpress.org/ticket/41185 on broken priority, but more general sanity check. + if ( empty( self::$events[ $filter_name ][ $priority ] ) ) { + return $input; + } + + $event = wp_parse_args( + self::$events[ $filter_name ][ $priority ], + array( + 'action' => 'start', + 'category' => null, + ) + ); + + if ( 'stop' === $event['action'] && ! self::$stopwatch->isStarted( $event['event'] ) ) { + return $input; + } + + self::$stopwatch->{$event['action']}( $event['event'], $event['category'] ); + + return $input; + } + + /** + * Capture SQL queries start times + * + * @param string $query + * + * @return string + */ + public static function query( $query ) { + + global $wpdb; + + if ( empty( self::$query_starts ) && ! empty( $wpdb->queries ) ) { + self::$query_starts[ count( $wpdb->queries ) ] = microtime( true ) * 1000; + } else { + self::$query_starts[] = microtime( true ) * 1000; + } + + return $query; + } + + /** + * Capture start time of HTTP request + * + * @param boolean $false + * @param array $args + * @param string $url + * + * @return boolean + */ + public static function pre_http_request( $false, $args, $url ) { + + self::$stopwatch->start( $url, 'http' ); + + return $false; + } + + /** + * Capture end time of HTTP request + * + * @param array|\WP_Error $response + * @param string $type + * @param object $class + * @param array $args + * @param string $url + * + * @return mixed + */ + public static function http_api_debug( $response, $type, $class, $args, $url ) { + + self::$stopwatch->stop( $url ); + + return $response; + } + + /** + * When theme is done possibly add vendor-specific events. + */ + public static function after_setup_theme() { + + foreach ( array( 'THA', 'Hybrid', 'Genesis', 'Thematic', 'Yoast' ) as $vendor ) { + + $class = "Rarst\\Laps\\{$vendor}_Events"; + /** @var Laps_Events $events */ + $events = new $class; + self::add_events( $events->get() ); + } + } + + public static function init() { + + add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) ); + add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) ); + add_action( 'admin_bar_menu', array( __CLASS__, 'admin_bar_menu' ), 100 ); + } + + public static function enqueue_scripts() { + + $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; + wp_register_script( 'laps', plugins_url( "js/laps{$suffix}.js", __DIR__ ), array( 'jquery' ), '3.3.1', true ); + wp_register_style( 'laps', plugins_url( "css/laps{$suffix}.css", __DIR__ ) ); + + if ( is_admin_bar_showing() ) { + wp_enqueue_script( 'laps' ); + wp_enqueue_style( 'laps' ); + } + } + + /** + * Render interface and add to the toolbar. + * + * @param \WP_Admin_Bar $wp_admin_bar + */ + public static function admin_bar_menu( $wp_admin_bar ) { + + if ( ! apply_filters( 'laps_can_see', current_user_can( 'manage_options' ) ) ) { + return; + } + + global $timestart, $wpdb; + + $mustache = new \Mustache_Engine( + array( + 'loader' => new \Mustache_Loader_FilesystemLoader( dirname( __DIR__ ) . '/views' ), + 'cache' => new Mustache_Cache_FrozenCache( dirname( __DIR__ ) . '/views/cache' ), + ) + ); + + if ( self::$stopwatch->isStarted( 'Toolbar' ) ) { + self::$stopwatch->stop( 'Toolbar' ); + } + + $events = self::$stopwatch->getSectionEvents( '__root__' ); + $start = $timestart * 1000; + $end = microtime( true ) * 1000; + $total = $end - $start; + $event_data = array(); + $http_data = array(); + + foreach ( $events as $name => $event ) { + + $offset = round( ( $event->getOrigin() - $start ) / $total * 100, 2 ); + $duration = $event->getDuration(); + $width = round( $duration / $total * 100, 2 ); + $category = $event->getCategory(); + + if ( 'http' === $category ) { + $http_data[] = compact( 'name', 'offset', 'duration', 'width', 'category' ); + continue; + } + + $memory = $event->getMemory() / 1024 / 1024; + + $event_data[] = compact( 'name', 'offset', 'duration', 'width', 'category', 'memory' ); + } + + $query_data = array(); + $last_query_end = 0; + $last_offset = 0; + $last_duration = 0; + + if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) { + + foreach ( $wpdb->queries as $key => $query ) { + $query_start = isset( self::$query_starts[ $key ] ) ? self::$query_starts[ $key ] : $last_query_end; + list( $sql, $duration, $trace ) = $query; + $sql = trim( $sql ); + $category = 'query-read'; + + if ( 0 === stripos( $sql, 'INSERT' ) || 0 === stripos( $sql, 'UPDATE' ) ) { + $category = 'query-write'; + } + + $duration *= 1000; + $last_query_end = $query_start + $duration; + $offset = round( ( $query_start - $start ) / $total * 100, 2 ); + + // if query is indistinguishably close to previous then stack it + if ( $offset === $last_offset ) { + $key = count( $query_data ) - 1; + $query_data[ $key ]['sql'] .= '
' . $sql; + + $last_duration += $duration; + $width = round( $last_duration / $total * 100, 2 ); + $query_data[ $key ]['width'] = $width; + + continue; + } + + $width = round( $duration / $total * 100, 2 ); + $last_offset = $offset; + $last_duration = $duration; + + $query_data[] = compact( 'sql', 'duration', 'offset', 'width', 'category' ); + } + } + + $html = $mustache->render( + 'laps', + array( + 'events' => $event_data, + 'queries' => $query_data, + 'savequeries' => defined( 'SAVEQUERIES' ) && SAVEQUERIES, + 'http' => $http_data, + 'savehttp' => ! empty( $http_data ), + ) + ); + + $wp_admin_bar->add_node( array( + 'id' => 'laps', + 'title' => sprintf( 'Lap: %ss', round( $total / 1000, 3 ) ), + ) ); + + $wp_admin_bar->add_node( array( + 'id' => 'laps_output', + 'parent' => 'laps', + 'meta' => array( 'html' => $html ), + ) ); + } +} diff --git a/src/class-events.php b/src/Laps_Events.php similarity index 93% rename from src/class-events.php rename to src/Laps_Events.php index 26efcee..50ad0e3 100644 --- a/src/class-events.php +++ b/src/Laps_Events.php @@ -1,40 +1,40 @@ -is_applicable() ) { - return $this->get_events(); - } - - return array(); - } - - /** - * Is event pack relevant to current runtime - * - * @return bool - */ - protected function is_applicable() { - - return true; - } - - /** - * Inherit with internal events compiling and return - * - * @return array - */ - abstract protected function get_events(); -} +is_applicable() ) { + return $this->get_events(); + } + + return array(); + } + + /** + * Is event pack relevant to current runtime + * + * @return bool + */ + protected function is_applicable() { + + return true; + } + + /** + * Inherit with internal events compiling and return + * + * @return array + */ + abstract protected function get_events(); +} diff --git a/src/class-mustache-cache-frozencache.php b/src/Mustache_Cache_FrozenCache.php similarity index 100% rename from src/class-mustache-cache-frozencache.php rename to src/Mustache_Cache_FrozenCache.php diff --git a/src/class-tha-events.php b/src/THA_Events.php similarity index 94% rename from src/class-tha-events.php rename to src/THA_Events.php index b09364c..a43d746 100644 --- a/src/class-tha-events.php +++ b/src/THA_Events.php @@ -1,51 +1,51 @@ - 'Header', - 'category' => 'theme', - ); - - $events['tha_header_after'][10] = array( - 'action' => 'stop', - 'event' => 'Header', - 'category' => 'theme', - ); - - $events['tha_sidebars_before'][10] = array( - 'event' => 'Sidebars', - 'category' => 'theme', - ); - - $events['tha_sidebars_after'][10] = array( - 'action' => 'stop', - 'event' => 'Sidebars', - 'category' => 'theme', - ); - - return $events; - } -} + 'Header', + 'category' => 'theme', + ); + + $events['tha_header_after'][10] = array( + 'action' => 'stop', + 'event' => 'Header', + 'category' => 'theme', + ); + + $events['tha_sidebars_before'][10] = array( + 'event' => 'Sidebars', + 'category' => 'theme', + ); + + $events['tha_sidebars_after'][10] = array( + 'action' => 'stop', + 'event' => 'Sidebars', + 'category' => 'theme', + ); + + return $events; + } +} diff --git a/src/class-thematic-events.php b/src/Thematic_Events.php similarity index 95% rename from src/class-thematic-events.php rename to src/Thematic_Events.php index dc94a33..c1e18d6 100644 --- a/src/class-thematic-events.php +++ b/src/Thematic_Events.php @@ -1,62 +1,62 @@ - 'Header', - 'category' => 'theme', - ); - - $events['thematic_belowheader'][10] = array( - 'action' => 'stop', - 'event' => 'Header', - 'category' => 'theme', - ); - - $events['widget_area_primary_aside'][10] = array( - 'event' => 'Sidebar (primary aside)', - 'category' => 'theme', - ); - - $events['thematic_betweenmainasides'][10] = array( - 'action' => 'stop', - 'event' => 'Sidebar (primary aside)', - 'category' => 'theme', - ); - - $events['widget_area_secondary_aside'][10] = array( - 'event' => 'Sidebar (secondary aside)', - 'category' => 'theme', - ); - - $events['thematic_belowmainasides'][10] = array( - 'action' => 'stop', - 'event' => 'Sidebar (secondary aside)', - 'category' => 'theme', - ); - - return $events; - } -} + 'Header', + 'category' => 'theme', + ); + + $events['thematic_belowheader'][10] = array( + 'action' => 'stop', + 'event' => 'Header', + 'category' => 'theme', + ); + + $events['widget_area_primary_aside'][10] = array( + 'event' => 'Sidebar (primary aside)', + 'category' => 'theme', + ); + + $events['thematic_betweenmainasides'][10] = array( + 'action' => 'stop', + 'event' => 'Sidebar (primary aside)', + 'category' => 'theme', + ); + + $events['widget_area_secondary_aside'][10] = array( + 'event' => 'Sidebar (secondary aside)', + 'category' => 'theme', + ); + + $events['thematic_belowmainasides'][10] = array( + 'action' => 'stop', + 'event' => 'Sidebar (secondary aside)', + 'category' => 'theme', + ); + + return $events; + } +} diff --git a/src/class-yoast-events.php b/src/Yoast_Events.php similarity index 100% rename from src/class-yoast-events.php rename to src/Yoast_Events.php