Surveillance de base des requête

La surveillance de base d'une requête est simple avec PECL/mysqlnd_uh. Combiné avec la fonction debug_print_backtrace(), ça peut devenir un outil très puissant, par exemple, pour trouver l'origine d'une requête. Ceci peut être nécessaire lors de la recherche de requêtes lentes, mais aussi après une re-factorisation de la base de données pour trouver le code continuant à accéder à une ancienne table ou base de données. Ce genre de recherche peut devenir vite compliqué en l'absence de ce genre d'outils, surtout si vous utilisez une application qui auto-génère des requêtes.

Exemple #1 Surveillance de base

<?php
class conn_proxy extends MysqlndUhConnection {
 public function query($res, $query) {
  debug_print_backtrace();
  return parent::query($res, $query);
 }
}
class stmt_proxy extends MysqlndUhPreparedStatement {
 public function prepare($res, $query) {
  debug_print_backtrace();
  return parent::prepare($res, $query);
 }
}
mysqlnd_uh_set_connection_proxy(new conn_proxy());
mysqlnd_uh_set_statement_proxy(new stmt_proxy());

printf("Proxies installed...\n");
$pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");
var_dump($pdo->query("SELECT 1 AS _one FROM DUAL")->fetchAll(PDO::FETCH_ASSOC));

$mysqli = new mysqli("localhost", "root", "", "test");
$mysqli->prepare("SELECT 1 AS _two FROM DUAL");
?>

L'exemple ci-dessus va afficher :

#0  conn_proxy->query(Resource id #19, SELECT 1 AS _one FROM DUAL)
#1  PDO->query(SELECT 1 AS _one FROM DUAL) called at [example.php:19]
array(1) {
  [0]=>
  array(1) {
    ["_one"]=>
    string(1) "1"
  }
}
#0  stmt_proxy->prepare(Resource id #753, SELECT 1 AS _two FROM DUAL)
#1  mysqli->prepare(SELECT 1 AS _two FROM DUAL) called at [example.php:22]

Pour une surveillance de base des requêtes, vous devriez installer une connexion et un proxy de requête préparée. Le proxy de connexion doit surcharger la classe MysqlndUhConnection::query(). Toutes les requêtes de base de données qui n'utilisent pas des requêtes préparées nativement devront appeler cette méthode. Dans l'exemple ci-dessus, la fonction query est invoquée par un appel PDO. Par défaut, PDO_MySQL utilise une émulation de requête préparée.

Toutes les requêtes préparées natives sont préparées avec la méthode prepare de mysqlnd exportée via MysqlndUhPreparedStatement::prepare(). Surchargez la classe MysqlndUhPreparedStatement et écrasez la fonction prepare pour une surveillance des requêtes préparées natives.

LoadingChargement en cours