Mesure de l'efficacité du cache
PECL/mysqlnd_qc fournit 3 façons de mesurer l'efficacité du cache. La fonction mysqlnd_qc_get_normalized_query_trace_log() retourne des statistiques aggrégées par la normalisation d'une chaîne de requête, la fonction mysqlnd_qc_get_cache_info() fournit des informations spécifiques au gestionnaire de stockage qui incluent une liste de tous les éléments mis en cache, suivant le gestionnaire de stockage. De plus, le cooeur de PECL/mysqlnd_qc collecte un résumé haut niveau des statistiques aggrégées par processus PHP. Les statistiques haut niveau sont retournées par la fonction mysqlnd_qc_get_core_stats().
Les fonctions mysqlnd_qc_get_normalized_query_trace_log() et mysqlnd_qc_get_core_stats() ne collecteront pas de données tant que leurs directives de configuration PHP correspondantes ne sont pas activées. Veuillez vous reporter aux différents exemples pour récupérer les noms de ces directives de configuration. La collecte de données est désactivée par défaut et ce, en raison des impacts sur la performances. Elle est configurable via la directive de configuration mysqlnd_qc.time_statistics. La collecte de statistiques quant au durée est activée par défaut mais uniquement effectuée si la collecte de données a été activée. Le fait d'enregistrer des statistiques quant au durée cause beaucoup d'appels système. Dans la plupart des cas, le bénéfice d'une surveillance l'emporte sur la perte de performance dûe aux appels système additionnelles.
Exemple #1 Collecte de données statistiques avec la configuration ini mysqlnd_qc.time_statistics
<?php /* connexion à MySQL */ $mysqli = new mysqli("host", "user", "password", "schema", "port", "socket"); $mysqli->query("DROP TABLE IF EXISTS test"); $mysqli->query("CREATE TABLE test(id INT)"); $mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)"); /* quelques requêtes */ for ($i = 1; $i <= 4; $i++) { $query = sprintf("/*%s*/SELECT id FROM test WHERE id = %d", MYSQLND_QC_ENABLE_SWITCH, $i % 2); $res = $mysqli->query($query); $res->free(); } var_dump(mysqlnd_qc_get_core_stats()); ?>
<?php /* connexion à MySQL */ $mysqli = new mysqli("host", "user", "password", "schema", "port", "socket"); $mysqli->query("DROP TABLE IF EXISTS test"); $mysqli->query("CREATE TABLE test(id INT)"); $mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)"); /* quelques requêtes pour remplir les traces */ for ($i = 1; $i <= 4; $i++) { $query = sprintf("/*%s*/SELECT id FROM test WHERE id = %d", MYSQLND_QC_ENABLE_SWITCH, $i % 2); $res = $mysqli->query($query); $res->free(); } var_dump(mysqlnd_qc_get_cache_info()); ?>
<?php /* connexion à MySQL */ $mysqli = new mysqli("host", "user", "password", "schema", "port", "socket"); $mysqli->query("DROP TABLE IF EXISTS test"); $mysqli->query("CREATE TABLE test(id INT)"); $mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)"); /* quelques requêtes pour remplir les traces */ for ($i = 1; $i <= 4; $i++) { $query = sprintf("/*%s*/SELECT id FROM test WHERE id = %d", MYSQLND_QC_ENABLE_SWITCH, $i % 2); $res = $mysqli->query($query); $res->free(); } var_dump(mysqlnd_qc_get_normalized_query_trace_log()); ?>
Les exemples ci-dessus vont afficher :
array(4) { [0]=> array(9) { ["query"]=> string(25) "DROP TABLE IF EXISTS test" ["occurences"]=> int(0) ["eligible_for_caching"]=> bool(false) ["avg_run_time"]=> int(0) ["min_run_time"]=> int(0) ["max_run_time"]=> int(0) ["avg_store_time"]=> int(0) ["min_store_time"]=> int(0) ["max_store_time"]=> int(0) } [1]=> array(9) { ["query"]=> string(27) "CREATE TABLE test (id INT )" ["occurences"]=> int(0) ["eligible_for_caching"]=> bool(false) ["avg_run_time"]=> int(0) ["min_run_time"]=> int(0) ["max_run_time"]=> int(0) ["avg_store_time"]=> int(0) ["min_store_time"]=> int(0) ["max_store_time"]=> int(0) } [2]=> array(9) { ["query"]=> string(46) "INSERT INTO test (id ) VALUES (? ), (? ), (? )" ["occurences"]=> int(0) ["eligible_for_caching"]=> bool(false) ["avg_run_time"]=> int(0) ["min_run_time"]=> int(0) ["max_run_time"]=> int(0) ["avg_store_time"]=> int(0) ["min_store_time"]=> int(0) ["max_store_time"]=> int(0) } [3]=> array(9) { ["query"]=> string(31) "SELECT id FROM test WHERE id =?" ["occurences"]=> int(4) ["eligible_for_caching"]=> bool(true) ["avg_run_time"]=> int(179) ["min_run_time"]=> int(11) ["max_run_time"]=> int(393) ["avg_store_time"]=> int(12) ["min_store_time"]=> int(7) ["max_store_time"]=> int(25) } }
Les sources de la distribution de PECL/mysqlnd_qc contiennent un dossier web/ dans lequel se trouve un script fournissant un exemple de surveillance du cache. Veuillez suivre les instructions se trouvant dans cette source.
Depuis PECL/mysqlnd_qc 1.1.0, il est possible d'écrire les statistiques dans un fichier de log. Voir la directive de configuration log file. Please, see mysqlnd_qc.collect_statistics_log_file pour plus d'informations.