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.