queries. // In production, SAVEQUERIES should be defined in wp-config.php for full data. } self::$profile_data = array( 'start_time' => microtime( true ), 'start_queries' => isset( $wpdb->queries ) ? count( $wpdb->queries ) : 0, 'memory_start' => memory_get_usage( true ), ); } /** * End profiling and return results. * * @return array Profiling data. */ public static function end_profiling() { global $wpdb; $end_time = microtime( true ); $end_queries = isset( $wpdb->queries ) ? count( $wpdb->queries ) : 0; $memory_end = memory_get_usage( true ); $total_time = round( ( $end_time - self::$profile_data['start_time'] ) * 1000, 2 ); $query_count = $end_queries - self::$profile_data['start_queries']; // Calculate total DB time from queries if available. $db_time = 0; $query_details = array(); if ( isset( $wpdb->queries ) && is_array( $wpdb->queries ) ) { $relevant_queries = array_slice( $wpdb->queries, self::$profile_data['start_queries'] ); foreach ( $relevant_queries as $q ) { $db_time += isset( $q[1] ) ? (float) $q[1] : 0; $query_details[] = array( 'sql' => isset( $q[0] ) ? substr( $q[0], 0, 200 ) : '', 'time' => isset( $q[1] ) ? round( (float) $q[1] * 1000, 2 ) : 0, 'caller' => isset( $q[2] ) ? substr( $q[2], 0, 150 ) : '', ); } } $db_time_ms = round( $db_time * 1000, 2 ); return array( 'total_time_ms' => $total_time, 'db_queries' => $query_count, 'db_time_ms' => $db_time_ms, 'php_time_ms' => round( $total_time - $db_time_ms, 2 ), 'memory_used_mb' => round( ( $memory_end - self::$profile_data['memory_start'] ) / 1048576, 2 ), 'memory_peak_mb' => round( memory_get_peak_usage( true ) / 1048576, 2 ), 'query_details' => array_slice( $query_details, 0, 50 ), // Cap for display. ); } /** * Get server environment info for the profiler panel. * * @return array */ public static function get_server_info() { global $wp_version; return array( 'php_version' => phpversion(), 'wp_version' => $wp_version, 'server' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : 'Unknown', 'mysql_version' => self::get_mysql_version(), 'memory_limit' => ini_get( 'memory_limit' ), 'max_exec_time' => ini_get( 'max_execution_time' ), 'savequeries' => defined( 'SAVEQUERIES' ) && SAVEQUERIES, 'wp_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG, ); } /** * Get MySQL version. * * @return string */ private static function get_mysql_version() { global $wpdb; return $wpdb->get_var( 'SELECT VERSION()' ) ?? 'Unknown'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery } }