SALT > Manuel > Tutoriel >
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é :

Liste des clés enregistrées par le framework

Les clés suivantes sont enregistrées automatiquement lors de l'utilisation du framework
CléTypeDescription
Initialisation / Chargement
salt.initTempsTemps de chargement de la classe principale Salt
salt.findClassesTempsSomme du temps passé par Salt pour parcourir tout les dossiers de lib à la recherche des classes pour la méthode autoload
salt.loadClassesTempsSomme du temps de chargement de toutes les classes par la méthode autoload
salt.classesCompteurNombre de classes chargées par la méthode autoload
Base de données
salt.bdConnectCompteurNombre de connexions à une base de données
salt.bdConnectTempsSomme du temps de connexion aux bases de données
salt.queriesCompteurNombre de requêtes exécutées
salt.queries-prepareTempsSomme du temps de préparation des requêtes + bindValues
salt.queries-execTempsSomme du temps d'exécution des requêtes
salt.queries-debugInfoTempsSomme du temps passé à construire les paramètres de debug des requêtes
salt.queriesDonnéesTableau 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.queriesValuesDonnéesPour chaque requête, le texte de la requête avec les valeurs utilisées, formatées simplement
salt.i18n.initTempsTemps total d'initialisation des locales de la classe d'internationalisation
salt.i18n.generateTempsTemps passé à générer des classes à partir de fichiers YAML
salt.i18n.generateCompteurNombre 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 :
TypeMéthodeDescription
Compteur incrementAugmente de 1 ou plus un compteur
decrementDiminue de 1 ou plus un compteur
resetCountRemet à 0 un compteur
Temps startDémarre ou redémarre un timer
stopMet en pause un timer et enregistre son temps depuis le dernier start()
endArrête définitivement un timer et enregistre son temps depuis le dernier start()
addTimeAjoute un temps fixe à un timer
resetTimeRemet à 0 un temps enregistré par un timer
Données addDataAjoute une donnée
hasDataPermet 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.
alert 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($vsalt\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>