QueryTracker
in package
Class QueryTracker
A configurable query tracking system that maintains an internal stack of executed SQL queries with timing information, bindings, and caller details for debugging purposes.
When enabled, tracks EVERYTHING: timing, bindings, and caller information. When disabled, zero performance overhead.
Usage: QueryTracker::enable(); QueryTracker::start(); // ... execute your query ... QueryTracker::stop($sql, $bindings); $queries = QueryTracker::getQueries(); QueryTracker::disable();
Tags
Table of Contents
Properties
- $config : array<string, mixed>
- Runtime configuration controlling tracking behavior and limits
- $currentStartTime : float|null
- High-precision start timestamp for current query timing
- $enabled : bool
- Master switch for query tracking functionality
- $queries : array<string|int, array<string, mixed>>
- FIFO queue storing tracked query metadata and performance information
Methods
- clear() : void
- Remove all tracked queries and reset timing state
- disable() : void
- Deactivate query tracking and reset timing state
- dump() : string
- Generate comprehensive formatted debug output for development analysis
- enable() : void
- Activate query tracking with optional configuration overrides
- getConfig() : array<string, mixed>
- Retrieve current tracking configuration parameters
- getFastestQuery() : array<string, mixed>|null
- Identify the fastest query execution from tracked queries
- getQueries() : array<string|int, array<string, mixed>>
- Retrieve complete array of all tracked query records
- getQueriesCount() : int
- Get total number of currently tracked queries
- getQueryPatterns() : array<string, array<string, mixed>>
- Analyze and group queries by SQL pattern for duplication detection
- getSlowestQuery() : array<string, mixed>|null
- Identify the slowest query execution from tracked queries
- getSlowQueries() : array<string|int, array<string, mixed>>
- Filter queries exceeding specified execution time threshold
- getSummary() : array<string, mixed>
- Generate comprehensive performance summary with aggregated statistics
- getTotalTime() : float
- Calculate total execution time across all tracked queries
- isEnabled() : bool
- Check current query tracking activation state
- reset() : void
- Cancel current query timing without recording measurement
- start() : void
- Begin high-precision timing for next query execution
- stop() : void
- Complete query timing and record comprehensive execution metadata
- toArray() : array<string, mixed>
- Export complete tracking data as structured array for external processing
- getCaller() : string|null
- Intelligent call stack analysis to identify application code initiating queries
Properties
$config
Runtime configuration controlling tracking behavior and limits
private
static array<string, mixed>
$config
= [
'max_queries' => 1000,
// Maximum queries to store (prevents memory issues)
'caller_depth' => 10,
]
Configuration array managing memory limits, call stack analysis depth, and other behavioral parameters. Provides runtime control over tracking features and resource consumption.
Configuration Keys
- max_queries: Maximum queries stored before FIFO removal (default: 1000)
- caller_depth: Call stack analysis depth for caller detection (default: 10)
Memory Protection
max_queries prevents memory exhaustion by maintaining reasonable query limits. Automatic validation ensures minimum value of 1 to prevent configuration errors.
Call Stack Control
caller_depth balances caller detection accuracy with performance overhead. Higher values provide better application code detection but increase processing time.
Runtime configuration parameters
Tags
$currentStartTime
High-precision start timestamp for current query timing
private
static float|null
$currentStartTime
= null
Stores microtime(true) timestamp when start() is called, used to calculate execution duration when stop() is invoked. Reset to null after each query to prevent timing contamination between queries.
Timing Precision
- Microsecond Accuracy: Uses microtime(true) for sub-millisecond precision
- Automatic Reset: Cleared after each stop() call to prevent timing errors
- Null Safety: Handles cases where stop() is called without start()
State Management
- Active Timing: Non-null float during query execution
- Idle State: Null when no query is being timed
- Error Recovery: Graceful handling of unbalanced start/stop calls
Microsecond-precision start time or null when idle
Tags
$enabled
Master switch for query tracking functionality
private
static bool
$enabled
= false
Controls whether query tracking is active across all QueryTracker operations. When false, all tracking methods return immediately with zero performance overhead. Essential for zero-overhead design in production environments.
Performance Impact
- Disabled (false): Zero overhead - all methods exit immediately
- Enabled (true): Full tracking with timing and metadata capture
- Runtime Toggle: Can be changed during execution for conditional tracking
Query tracking enabled state
Tags
$queries
FIFO queue storing tracked query metadata and performance information
private
static array<string|int, array<string, mixed>>
$queries
= []
Array storing complete query tracking information including execution time, parameter bindings, timestamps, and caller details. Managed as FIFO queue with automatic oldest-query removal when maximum limit is reached.
Query Entry Structure
Each entry contains:
sql
: Trimmed SQL query stringtimestamp
: High-precision timestamp (Y-m-d H:i:s.u format)sequence
: Sequential query number for execution orderexecution_time
: Microsecond-precision timing (6 decimal places)bindings
: Parameter array used with prepared statementsbinding_count
: Number of parameters for quick referencecaller
: Application code location that initiated query
Memory Management
- FIFO Queue: Oldest queries removed when max_queries limit reached
- Efficient Storage: Only essential metadata stored per query
- Configurable Limits: Prevents memory exhaustion in long-running processes
FIFO queue of query tracking information
Tags
Methods
clear()
Remove all tracked queries and reset timing state
public
static clear() : void
Clears complete query tracking history and resets current timing state for fresh analysis sessions. Essential for isolating performance analysis between different code sections or test scenarios.
Complete State Reset
- Query History: Removes all tracked query records
- Timer State: Resets current timing to prevent contamination
- Memory Recovery: Frees memory used by query tracking data
- Configuration Preservation: Maintains current configuration settings
Use Cases
- Test Isolation: Clear state between test scenarios
- Analysis Segmentation: Separate tracking for different code paths
- Memory Management: Periodic clearing in long-running processes
- Benchmark Preparation: Clean slate for performance measurements
Tags
disable()
Deactivate query tracking and reset timing state
public
static disable() : void
Disables query tracking system for zero-overhead operation and resets current timing state to prevent timing contamination. Does not clear stored query data - use clear() separately if needed.
Performance Restoration
After disable(), all QueryTracker methods return immediately with no processing overhead, restoring full application performance.
State Reset
- Tracking Disabled: All tracking methods become no-ops
- Timer Reset: Current timing state cleared to prevent errors
- Data Preservation: Previously tracked queries remain available
Usage Patterns
Typically called after analysis completion or when switching from development to production performance requirements.
Tags
dump()
Generate comprehensive formatted debug output for development analysis
public
static dump([bool $return = false ]) : string
Creates detailed, human-readable output of all tracked queries with complete metadata, execution statistics, and summary information. Essential development tool for query analysis and debugging sessions.
Output Format
- Header: Query count and tracking status
- Query Details: Individual query information with timing, SQL, parameters, and caller
- Summary Statistics: Aggregated performance metrics
- Formatted Display: Console-friendly formatting with separators
Comprehensive Query Information
For each query displays:
- Sequence number and timestamp
- Execution time with microsecond precision
- Complete SQL query
- Parameter bindings (if present)
- Application caller location (if detected)
Flexible Output Options
- Console Output: Direct echo for interactive debugging
- Return Value: String capture for logging or file output
- Dual Mode: Always returns string regardless of echo parameter
Parameters
- $return : bool = false
-
Whether to return output string instead of echoing (default: false)
Tags
Return values
string —Complete formatted debug output (always returned)
enable()
Activate query tracking with optional configuration overrides
public
static enable([array<string, mixed> $config = [] ]) : void
Enables query tracking system and merges provided configuration with defaults. Validates configuration parameters to ensure safe operation and prevents memory-related issues through configuration validation.
Configuration Parameters
- max_queries: Maximum tracked queries (prevents memory exhaustion)
- caller_depth: Call stack analysis depth (balances accuracy vs performance)
Configuration Validation
- max_queries: Enforces minimum value of 1000 for safety
- Invalid Values: Automatically corrected to prevent system issues
- Runtime Override: Existing configuration merged with new parameters
Performance Considerations
Enabling tracking introduces performance overhead proportional to query volume. Use selectively in development or conditional production monitoring scenarios.
Parameters
- $config : array<string, mixed> = []
-
Optional configuration overrides
Tags
getConfig()
Retrieve current tracking configuration parameters
public
static getConfig() : array<string, mixed>
Returns complete configuration array for inspection, debugging, and configuration validation. Useful for confirming configuration state and troubleshooting tracking behavior.
Configuration Parameters
- max_queries: Maximum tracked queries before FIFO removal
- caller_depth: Call stack analysis depth for caller detection
Use Cases
- Configuration Validation: Confirm settings are applied correctly
- Debug Information: Include configuration in debug output
- Status Reporting: Show current configuration in monitoring interfaces
- Dynamic Adjustment: Base configuration changes on current settings
Tags
Return values
array<string, mixed> —Complete configuration parameter array
getFastestQuery()
Identify the fastest query execution from tracked queries
public
static getFastestQuery() : array<string, mixed>|null
Returns single query record with minimum execution time for performance baseline analysis and best-case timing identification. Useful for understanding optimal query performance characteristics.
Performance Analysis Applications
- Baseline Establishment: Understand best-case query performance
- Optimization Validation: Verify optimization effectiveness
- Performance Variance: Compare fastest vs slowest for consistency analysis
- Caching Impact: Identify performance improvements from caching
Null Handling
Returns null when no queries are tracked, enabling safe usage without pre-checking query count.
Tags
Return values
array<string, mixed>|null —Fastest query record or null if no queries tracked
getQueries()
Retrieve complete array of all tracked query records
public
static getQueries() : array<string|int, array<string, mixed>>
Returns comprehensive query tracking data including execution times, parameter bindings, caller information, and metadata for each recorded query. Essential for detailed performance analysis and debugging.
Return Data Structure
Each query record contains:
sql
: Executed SQL query stringtimestamp
: Execution timestamp (Y-m-d H:i:s.u format)sequence
: Sequential execution numberexecution_time
: Microsecond-precision timing (6 decimal places)bindings
: Complete parameter binding arraybinding_count
: Parameter count for quick referencecaller
: Application code location that initiated query
Analysis Applications
- Performance Profiling: Identify slow queries and bottlenecks
- Query Optimization: Analyze SQL patterns and parameter usage
- Debug Tracing: Trace query execution flow and timing
- Pattern Detection: Find N+1 queries and optimization opportunities
Tags
Return values
array<string|int, array<string, mixed>> —Complete query tracking records
getQueriesCount()
Get total number of currently tracked queries
public
static getQueriesCount() : int
Returns count of queries in tracking queue. Lightweight alternative to retrieving full query array when only count information is needed. Useful for monitoring tracking volume and memory usage estimation.
Performance Advantage
Simple count operation without data serialization overhead when only quantity information is required for monitoring or display purposes.
Monitoring Applications
- Memory Usage: Estimate tracking memory consumption
- Volume Analysis: Monitor query volume over time
- Interface Display: Show query count in debug panels
- Threshold Alerts: Trigger alerts for excessive query volumes
Tags
Return values
int —Number of tracked queries in current queue
getQueryPatterns()
Analyze and group queries by SQL pattern for duplication detection
public
static getQueryPatterns() : array<string, array<string, mixed>>
Groups identical SQL queries and calculates aggregated statistics including execution count, total time, and average time per pattern. Essential for identifying N+1 query problems and optimization opportunities through query pattern analysis.
Pattern Analysis Benefits
- N+1 Detection: Identify repeated queries in loops
- Caching Opportunities: Find frequently executed queries for caching
- Batch Optimization: Group similar queries for batch processing
- Performance Patterns: Understand query frequency vs performance relationships
Statistics Calculation
For each unique SQL pattern:
- count: Number of times the query was executed
- total_time: Cumulative execution time for all instances
- avg_time: Average execution time per query instance
Return Structure
Associative array with SQL query as key and statistics as value:
[
'SELECT * FROM users WHERE id = ?' => [
'count' => 15,
'total_time' => 0.075,
'avg_time' => 0.005
]
]
Tags
Return values
array<string, array<string, mixed>> —SQL patterns with execution statistics
getSlowestQuery()
Identify the slowest query execution from tracked queries
public
static getSlowestQuery() : array<string, mixed>|null
Returns single query record with maximum execution time for bottleneck identification and optimization prioritization. Primary tool for finding the most critical performance improvement opportunities.
Optimization Priority
The slowest query typically represents the highest-impact optimization opportunity, making it the primary target for performance improvement efforts.
Bottleneck Analysis
Slowest queries often indicate:
- Missing or ineffective database indexes
- Complex query logic requiring restructuring
- Large dataset operations needing optimization
- N+1 query patterns requiring eager loading
Tags
Return values
array<string, mixed>|null —Slowest query record or null if no queries tracked
getSlowQueries()
Filter queries exceeding specified execution time threshold
public
static getSlowQueries([float $threshold = 0.1 ]) : array<string|int, array<string, mixed>>
Returns queries with execution time greater than or equal to threshold, enabling focused analysis of performance bottlenecks and optimization opportunities. Essential tool for identifying slow query patterns.
Threshold Configuration
- Default Threshold: 0.1 seconds (100 milliseconds)
- Configurable: Any float value for different analysis needs
- Inclusive Filter: Returns queries with time >= threshold
Optimization Workflow
Slow queries typically indicate optimization opportunities through:
- Index analysis and creation
- Query restructuring and optimization
- Data model refinements
- Caching strategies
Parameters
- $threshold : float = 0.1
-
Minimum execution time in seconds (default: 0.1)
Tags
Return values
array<string|int, array<string, mixed>> —Queries exceeding threshold
getSummary()
Generate comprehensive performance summary with aggregated statistics
public
static getSummary() : array<string, mixed>
Creates complete performance overview including query counts, timing statistics, configuration details, and performance extremes. Essential for high-level performance assessment and reporting.
Summary Components
- total_queries: Number of tracked queries
- tracking_enabled: Current tracking state
- total_time: Cumulative execution time across all queries
- avg_time: Average execution time per query
- fastest_time: Minimum query execution time
- slowest_time: Maximum query execution time
- config: Current tracking configuration
Statistical Accuracy
- Conditional Calculations: Statistics only computed when queries exist
- Precision Consistency: 6 decimal place rounding for timing values
- Safe Handling: Graceful handling of empty query sets
Tags
Return values
array<string, mixed> —Comprehensive performance and configuration summary
getTotalTime()
Calculate total execution time across all tracked queries
public
static getTotalTime() : float
Aggregates execution times from all tracked queries to provide cumulative database time measurement. Essential for overall performance assessment and database time percentage calculation in request profiling.
Precision and Accuracy
- Microsecond Precision: 6 decimal place accuracy for sub-millisecond timing
- Cumulative Calculation: Sums individual query execution times
- Rounding: Final result rounded to 6 decimal places for consistency
Performance Analysis Applications
- Request Profiling: Calculate database time as percentage of total request time
- Optimization Targets: Identify high database time for optimization focus
- Performance Trending: Track database time trends over application lifecycle
- Threshold Monitoring: Alert on excessive cumulative database time
Tags
Return values
float —Total execution time in seconds with microsecond precision
isEnabled()
Check current query tracking activation state
public
static isEnabled() : bool
Returns current tracking status for conditional logic and system status checking. Useful for conditional tracking operations and debugging interface state management.
Use Cases
- Conditional Operations: Execute tracking code only when enabled
- Status Reporting: Include tracking state in system status reports
- Debug Interfaces: Show current tracking state in development tools
- Performance Monitoring: Log tracking overhead in production metrics
Performance Impact
Lightweight boolean check with minimal overhead suitable for frequent calls.
Tags
Return values
bool —True if tracking is active, false if disabled
reset()
Cancel current query timing without recording measurement
public
static reset() : void
Resets timing state without creating query record. Useful for error recovery scenarios where query execution is interrupted or when timing needs to be canceled due to exceptional conditions.
Use Cases
- Error Recovery: Cancel timing when query execution fails
- Conditional Logic: Cancel timing based on runtime decisions
- Testing Scenarios: Reset timing state for controlled test conditions
- Exception Handling: Clean timing state in exception handlers
State Cleanup
Safely resets timing state without affecting previously recorded queries or overall tracking configuration.
Tags
start()
Begin high-precision timing for next query execution
public
static start() : void
Records current microtime for query execution timing. Zero overhead when tracking is disabled. Must be called before database operation for accurate timing measurement.
Timing Precision
Uses microtime(true) for microsecond-level precision enabling detection of sub-millisecond query performance variations critical for optimization.
Zero-Overhead Design
Immediate return when tracking disabled ensures no performance impact in production environments where tracking is unnecessary.
Usage Pattern
Always call start() immediately before database operation and stop() immediately after for accurate timing measurement.
Tags
stop()
Complete query timing and record comprehensive execution metadata
public
static stop(string $sql[, array<string|int, mixed> $bindings = [] ]) : void
Calculates execution time from start() call and creates complete query record with timing, parameters, and caller information. Implements memory management through FIFO queue with configurable limits.
Zero-Overhead Protection
Immediate return when tracking disabled ensures no performance impact. Critical for production environments where tracking is conditionally disabled.
Comprehensive Metadata Capture
Records complete query information:
- Execution Time: Microsecond precision from start() to stop()
- SQL Query: Trimmed query string for analysis
- Parameter Bindings: Complete parameter array for debugging
- Timestamp: High-precision execution timestamp
- Caller Information: Application code location that initiated query
- Sequence Number: Execution order for chronological analysis
Memory Management
- FIFO Queue: Automatic oldest query removal at max_queries limit
- Memory Protection: Prevents memory exhaustion in long-running processes
- Efficient Storage: Only essential metadata stored per query
Parameters
- $sql : string
-
SQL query that was executed (will be trimmed)
- $bindings : array<string|int, mixed> = []
-
Parameter array used with prepared statement
Tags
toArray()
Export complete tracking data as structured array for external processing
public
static toArray() : array<string, mixed>
Creates comprehensive data export containing performance summary, complete query history, and pattern analysis in structured format. Ideal for JSON serialization, external analysis tools, and data persistence.
Export Structure
Returns associative array with three main sections:
- summary: Complete performance statistics and configuration
- queries: Full query history with all metadata
- patterns: Query pattern analysis with execution statistics
Processing Applications
- JSON Export: Direct json_encode() compatibility
- External Tools: Import into analysis and visualization tools
- Data Persistence: Store tracking data for historical analysis
- API Responses: Include performance data in API responses
- Report Generation: Feed data into reporting systems
Data Completeness
Provides complete dataset including all tracked queries, performance metrics, pattern analysis, and configuration information for comprehensive analysis.
Tags
Return values
array<string, mixed> —Complete tracking data with summary, queries, and patterns
getCaller()
Intelligent call stack analysis to identify application code initiating queries
private
static getCaller() : string|null
Analyzes debug backtrace to find the application code location that initiated the database query, filtering out framework files to provide meaningful caller information for debugging and optimization purposes.
Framework-Aware Filtering
Skips known framework files to identify actual application code:
- QueryTracker.php, Model.php, QueryBuilder.php
- Validator.php, ConnectionManager.php, Router.php
- Configurable via $frameworkFiles array
Call Stack Analysis
- Configurable Depth: Respects caller_depth configuration setting
- Memory Efficient: Uses DEBUG_BACKTRACE_IGNORE_ARGS for performance
- Path Normalization: Converts absolute paths to relative for readability
Tags
Return values
string|null —Caller location in "file:line" format or null if not found