* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org) * @license GNU-GPL-v3 * @license CECILL-v2 */ class Chronometre { /*** Attributs : ***/ private static $instance = null; private static $temps = array(); /** Constructeur : **/ private function __construct() { self::setTemps('depart', microtime()); } /** Accesseurs : * * @param string $cle la cle associée à un chronomètre particulier * * @return int le temps écoulé */ private static function getTemps($cle = null) { $temps = ''; if (!is_null($cle)) { $temps = self::$temps[$cle]; } else { $temps = self::$temps; } return $temps; } /** Setteur pour la variable temps * * @param array() $moment ajoute des points de chronométrage au tableau _temps * * @return null */ private static function setTemps($cle, $moment) { array_push(self::$temps, array($cle => $moment)); } /*** Méthodes : ***/ /** * Effectue un chronometrage. * * @param string le nom du point de chronométrage * @return null */ public static function chrono($cle) { $moment = microtime(); self::verifierCreationInstance(); self::setTemps($cle, $moment); } /** * Permet d'afficher les temps d'éxécution de différentes parties d'un script. * * Cette fonction permet d'afficher un ensemble de mesure de temps prises à différents endroits d'un script. * Ces mesures sont affichées au sein d'un tableau XHTML dont on peut controler l'indentation des balises. * Pour un site en production, il suffit d'ajouter un style #chrono {display:none;} dans la css. * De cette façon, le tableau ne s'affichera pas. Le webmaster lui pourra rajouter sa propre feuille de style * affichant le tableau. * Le développeur initial de cette fonction est Loic d'Anterroches. * Elle a été modifiée par Jean-Pascal Milcent. * * @author Loic d'Anterroches * @author Jean-Pascal MILCENT * * @param int $indentation_origine l'indentation de base. * @param int $indentation le pas d'indentation. * @return string la chaine XHTML de mesure des temps. */ public static function afficherChrono($indentation_origine = 8, $indentation = 4) { self::verifierCreationInstance(); // Création du chrono de fin self::setTemps('fin', microtime()); // Début création de l'affichage $sortie = str_repeat(' ', $indentation_origine) . '' . "\n"; $sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . '' . "\n"; $sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . '' . "\n"; $sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))) . '' . "\n"; $sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . '' . "\n"; $tbody = str_repeat(' ', ($indentation_origine + ($indentation * 1))) . '' . "\n"; $total_tps_ecoule = 0; // Récupération de la premiére mesure $tab_depart = self::getTemps(0); list ($usec, $sec) = explode(' ', $tab_depart['depart']); // Ce temps correspond à tps_fin $tps_debut = ((float) $usec + (float) $sec); foreach (self::getTemps() as $tab_temps) { foreach ($tab_temps as $cle => $valeur) { list ($usec, $sec) = explode(' ', $valeur); $tps_fin = ((float) $usec + (float) $sec); $tps_ecoule = abs($tps_fin - $tps_debut); $total_tps_ecoule += $tps_ecoule; $tbody .= str_repeat(' ', ($indentation_origine + ($indentation * 2))) . '' . '' . '' . '' . '' . "\n"; $tps_debut = $tps_fin; } } $tbody .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . '' . "\n"; $sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . '' . "\n"; $sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))) . '' . '' . '' . '' . "\n"; $sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . '' . "\n"; $sortie .= $tbody; $sortie .= str_repeat(' ', $indentation_origine) . '
Chronométrage
ActionTemps écoulé (en s.) Cumul du temps écoulé (en s.)
' . $cle . '' . number_format($tps_ecoule, 3, ',', ' ') . '' . number_format($total_tps_ecoule, 3, ',', ' ') . '
' . 'Total du temps écoulé (en s.)' . '' . number_format($total_tps_ecoule, 3, ',', ' ') . '
' . "\n"; return $sortie; } /** * Vérifie si l'instance de classe à été crée, si non la crée */ private static function verifierCreationInstance() { if (empty(self::$instance)) { self::$instance = new Chronometre(); } } } ?>