From 33e4a5d9dfe9c8a54d6f03737c452bb249f5099a Mon Sep 17 00:00:00 2001 From: Franck DAKIA Date: Sun, 7 Jun 2026 21:47:36 +0000 Subject: [PATCH] feat(database): implement query execution performance metric mesurement --- src/Database/Database.php | 9 ++++++--- src/Database/QueryBuilder.php | 17 ++++++++++++----- src/Database/QueryEvent.php | 16 +++++++++++++--- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/Database/Database.php b/src/Database/Database.php index 4421036d..0bcdc1f7 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -191,9 +191,11 @@ private static function executePrepareQuery(string $sql_statement, array $data = Sanitize::make($data, true) ); + $start_at = microtime(true); $pdo_statement->execute(); + $ended_at = microtime(true); - static::triggerQueryEvent($sql_statement, $data); + static::triggerQueryEvent($sql_statement, $ended_at - $start_at, $data); return $pdo_statement->rowCount(); } @@ -490,12 +492,13 @@ public static function setPdo(PDO $pdo): void * Trigger the query executed event * * @param string $sql + * @param float $execution_time * @param array $bindings * @return void */ - public static function triggerQueryEvent(string $sql, array $bindings = []): void + public static function triggerQueryEvent(string $sql, float $execution_time = 0, array $bindings = []): void { - $event = new QueryEvent($sql, $bindings); + $event = new QueryEvent($sql, $execution_time, $bindings); app_event($event); } diff --git a/src/Database/QueryBuilder.php b/src/Database/QueryBuilder.php index dddd8c73..24ee5a54 100644 --- a/src/Database/QueryBuilder.php +++ b/src/Database/QueryBuilder.php @@ -1417,9 +1417,11 @@ public function truncate(): bool $this->last_query = $sql; + $start_at = microtime(true); $result = (bool) $this->connection->exec($sql); + $ended_at = microtime(true); - $this->triggerQueryEvent($sql, []); + $this->triggerQueryEvent($sql, $ended_at - $start_at); $this->last_query = $sql; @@ -1523,9 +1525,11 @@ private function execute(string $sql, array $bindings = []): PDOStatement $this->bind($statement, $bindings); try { + $start_at = microtime(true); $statement->execute(); + $ended_at = microtime(true); - $this->triggerQueryEvent($sql, $bindings); + $this->triggerQueryEvent($sql, $ended_at - $start_at, $bindings); } catch (\Exception $e) { throw new QueryBuilderException( 'Error executing query: ' . $e->getMessage() . ' | Query: ' . $this->last_query, @@ -1548,9 +1552,11 @@ public function drop(): bool $this->last_query = $sql; + $start_at = microtime(true); $result = (bool) $this->connection->exec($sql); + $ended_at = microtime(true); - $this->triggerQueryEvent($sql, []); + $this->triggerQueryEvent($sql, $ended_at - $start_at); return $result; } @@ -1668,12 +1674,13 @@ public function setWhereDataBinding(array $data_binding): void * Trigger the query event * * @param string $sql + * @param float $execution_time * @param array $bindings * @return void */ - private function triggerQueryEvent(string $sql, array $bindings): void + private function triggerQueryEvent(string $sql, float $execution_time = 0, array $bindings = []): void { - Database::triggerQueryEvent($sql, $bindings); + Database::triggerQueryEvent($sql, $execution_time, $bindings); } /** diff --git a/src/Database/QueryEvent.php b/src/Database/QueryEvent.php index 0edbae8c..d0e4dbf4 100644 --- a/src/Database/QueryEvent.php +++ b/src/Database/QueryEvent.php @@ -18,6 +18,13 @@ final class QueryEvent implements AppEvent */ public string $sql; + /** + * Define the query execution time + * + * @var mixed + */ + public float $execution_time; + /** * The query bindings * @@ -28,11 +35,14 @@ final class QueryEvent implements AppEvent /** * QueryEvent constructor. * - * @param array $data + * @param string $sql + * @param float $execution_time + * @param array $bindings */ - public function __construct(string $sql, array $bindings = []) + public function __construct(string $sql, float $execution_time = 0, array $bindings = []) { $this->sql = $sql; + $this->execution_time = $execution_time; $this->bindings = $bindings; } @@ -51,7 +61,7 @@ public function getName(): string * @param mixed $value * @throws \Exception */ - public function __set($name, $value) + final public function __set($name, $value) { throw new \Exception("Cannot set property $name on QueryEvent"); }