Le framework SALT facilite le debuggage en traçant ce qu'il fait avec la classe
Benchmark
Cette classe permet d'enregistrer des informations de 3 types, chaque information étant liée à une clé :
- Compteur
- Temps d'exécution
- Données internes
Liste des clés enregistrées par le framework
Les clés suivantes sont enregistrées automatiquement lors de l'utilisation du framework
| Clé | Type | Description |
| Initialisation / Chargement |
| salt.init | Temps | Temps de chargement de la classe principale Salt |
| salt.findClasses | Temps | Somme du temps passé par Salt pour parcourir tout les dossiers
de lib à la recherche des classes pour la méthode autoload |
| salt.loadClasses | Temps | Somme du temps de chargement de toutes les classes par la méthode autoload |
| salt.classes | Compteur | Nombre de classes chargées par la méthode autoload |
| Base de données |
| salt.bdConnect | Compteur | Nombre de connexions à une base de données |
| salt.bdConnect | Temps | Somme du temps de connexion aux bases de données |
| salt.queries | Compteur | Nombre de requêtes exécutées |
| salt.queries-prepare | Temps | Somme du temps de préparation des requêtes + bindValues |
| salt.queries-exec | Temps | Somme du temps d'exécution des requêtes |
| salt.queries-debugInfo | Temps | Somme du temps passé à construire les paramètres de debug des requêtes |
| salt.queries | Données | Tableau associatif contenant, pour chaque requête : ('Query'=> texte de la requête
préparée, 'Time' => Temps d'exécution de la requête ou ERROR si la requête a échouée) |
| salt.queriesValues | Données | Pour chaque requête, le texte de la requête avec les valeurs utilisées,
formatées simplement |
| salt.i18n.init | Temps | Temps total d'initialisation des locales de la classe d'internationalisation |
| salt.i18n.generate | Temps | Temps passé à générer des classes à partir de fichiers YAML |
| salt.i18n.generate | Compteur | Nombre de classes générées à partir de fichiers YAML |
Utilisation de la classe Benchmark
La classe Benchmark peut être utilisée également pour votre application.
Elle est chargée automatiquement dès le chargement de la classe principale Salt
Les méthodes pour gérer les 3 types d'informations sont :
| Type | Méthode | Description |
| Compteur | increment | Augmente de 1 ou plus un compteur |
| decrement | Diminue de 1 ou plus un compteur |
| resetCount | Remet à 0 un compteur |
| Temps | start | Démarre ou redémarre un timer |
| stop | Met en pause un timer et enregistre son temps depuis le dernier start() |
| end | Arrête définitivement un timer et enregistre son temps depuis le dernier start() |
| addTime | Ajoute un temps fixe à un timer |
| resetTime | Remet à 0 un temps enregistré par un timer |
| Données | addData | Ajoute une donnée |
| hasData | Permet de vérifier qu'une clé de donnée existe |
Chaque information se récupère avec
getTime, getCounter, getData ou encore
getAllTimes, getAllCounters, getAllDatas
Pattern proposé
Le framework Salt propose un pattern qui est celui utilisé sur ce site :
En bas de chaque page s'affiche le temps passé pour générer la page.
Un clic sur ce temps affiche le détail de tout les compteurs et de toutes les requêtes préparées.
Un clic sur chaque requête préparée affiche les valeurs utilisées de la requête.

Ces informations ne sont visibles que sur les pages d'exemples (voir
requêtes sur
les dates) car afficher les requêtes exécutées à tout le monde n'est pas très sécurisé.
En réalité, on conditionne l'affichage du bloc de debug par un paramètre serveur afin qu'il s'affiche en développement mais pas en production.
Le pattern utilise JQuery pour gérer l'event de clic et reformate un peu les requêtes pour améliorer leur lisibilité :
<?php
<table class="footer benchmark hidden">
<tr><th>Compteurs</th><th>Temps</th></tr>
<tr>
<td>
<?php Benchmark::stop('page'); Benchmark::start('page'); // pour mettre à jour le temps et qu'il soit visible ci dessous ?>
<?php $counts = Benchmark::getAllCounters(); ksort($counts) ?>
<?php foreach($counts as $k => $v) { ?>
<?= $Input->HTML($k)?>: <?= $Input->HTML($v) ?><br/>
<?php } ?>
</td>
<td>
<?php $times = Benchmark::getAllTimes(); ksort($times) ?>
<?php foreach($times as $k => $v) { ?>
<?= $Input->HTML($k)?>: <?= $Input->HTML(round($v, salt\BENCH_PRECISION))?> s<br/>
<?php }?>
</td>
</tr>
</table>
<?php if (Benchmark::hasData('salt.queries')) {?>
<table class="benchmark sql hidden">
<tr>
<?php foreach(\salt\first(Benchmark::getData('salt.queries')) as $k => $v) {?>
<th><?= $Input->HTML($k) ?></th>
<?php }?>
</tr>
<?php foreach(Benchmark::getData('salt.queries') as $k=>$data) { ?>
<tr>
<?php foreach($data as $v) { ?>
<td onclick="javascript:$(this).next('td').first().toggle();$(this).toggle()">
<?= nl2br($Input->HTML(preg_replace('( (?:FROM|[A-Z ]+ JOIN|WHERE|GROUP|ORDER|LIMIT|SET) )', "\n".' $0 ', $v))) ?>
</td>
<td class="hidden" onclick="javascript:$(this).prev('td').first().toggle();$(this).toggle()">
<?php $values = Benchmark::getData('salt.queriesValues') ?>
<?= nl2br($Input->HTML(preg_replace('( (?:FROM|[A-Z ]+ JOIN|WHERE|GROUP|ORDER|LIMIT|SET) )', "\n".' $0 ', $values[$k]))) ?>
</td>
<?php }?>
</tr>
<?php }?>
</table>
<?php }?>
<div onclick="javascript:$('table.benchmark').toggle();">
Page générée en <?= round(Benchmark::end('page'), salt\BENCH_PRECISION) ?> s
</div>