1: <?php
2: // declare(encoding='UTF-8');
3: /**
4: * Classe fournissant des fonctions de débogage équivalante à var_dump et print_r.
5: * L'affichage et l'utilisation de ces fonctions sont améliorés via cette classe.
6: * Cette classe est inspirée de la classe Zend_Debug.
7: *
8: * @category PHP 5.2
9: * @package Framework
10: * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
11: * @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
12: * @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
13: * @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
14: * @version $Id: Debug.php 365 2011-09-30 08:19:57Z jpm $
15: * @link /doc/framework/
16: */
17: class Debug {
18:
19: /** Paramètrer le fichier de config avec "php:Debug::MODE_ECHO" : les messages sont affichés en utilisant echo au moment
20: * où ils sont déclenchés dans le code.*/
21: const MODE_ECHO = 'echo';
22:
23: /** Paramètrer le fichier de config avec "php:Debug::MODE_NOTICE" : les message sont stockés par le gestionnaire
24: * d'exception sous forme d'erreur de type E_USER_NOTICE et sont renvoyés sur la sortie standard à la fin de l'execution
25: * du programme (via echo).*/
26: const MODE_NOTICE = 'e_user_notice';
27:
28: /** Paramètrer le fichier de config avec "php:Debug::MODE_ENTETE_HTTP" : les message sont stockés par le gestionnaire
29: * d'exception sous forme d'erreur de type E_USER_NOTICE et sont renvoyés dans un entête HTTP (X_REST_DEBOGAGE_MESSAGES)
30: * à la fin de l'execution du programme.
31: * Surtout utile pour le Serveur REST. */
32: const MODE_ENTETE_HTTP = 'entete_http';
33:
34: /** Mode de php (cli ou sapi) */
35: protected static $mode = null;
36:
37: /** Tableau des noms des paramètres à définir dans le fichier de config car obligatoirement nécessaire à cette classe.*/
38: private static $parametres_obligatoires = array('debogage', 'debogage_mode');
39:
40: /**
41: * Accesseur pour le mode
42: * @return string le mode de php
43: */
44: public static function getMode() {
45: if (self::$mode === null) {
46: self::$mode = PHP_SAPI;
47: }
48: return self::$mode;
49: }
50:
51: /**
52: * Equivalent de var_dump
53: * @param mixed $variable la variable à dumper
54: * @param string $mot_cle le mot cle à associer à la variable
55: * @param boolean $echo si true on affiche le résultat, si false on ne renvoie que la chaine sans l'afficher
56: * @return string la chaine à afficher representant le dump ou null si echo
57: */
58: public static function dump($variable, $mot_cle = null, $echo = false) {
59: // var_dump de la variable dans un buffer et récupération de la sortie
60: ob_start();
61: var_dump($variable);
62: $sortie = ob_get_clean();
63:
64: // Pré-traitement de la sortie
65: $sortie = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $sortie);
66:
67: // Traitement général du débogage
68: return self::traiterDebogage($mot_cle, $sortie, $echo);
69: }
70:
71: /**
72: * Equivalent de print_r.
73: * @param mixed $variable la variable à afficher
74: * @param string $mot_cle le mot cle à associer
75: * @param boolean $echo faire un echo ou non
76: * @return string la chaine contenant la variable printée ou null si echo
77: */
78: public static function printr($variable, $mot_cle = null, $echo = false) {
79: // Récupération de la sortie
80: $sortie = print_r($variable, true);
81:
82: // Traitement général du débogage
83: return self::traiterDebogage($mot_cle, $sortie, $echo);
84: }
85:
86: /**
87: * Affichage d'informations sur l'espace mémoire occupé par une variable
88: *
89: * @link http://forum.webmaster-rank.info/developpement-site/code-taille-memoire-d-une-variable-en-php-t1344.html
90: * @since 0.3
91: *
92: * @param mixed $var la variable dont on veut connaître l'empreinte mémoire.
93: * @param string $mot_cle le mot cle à associer
94: * @param boolean $echo faire un echo ou non
95: *
96: * @return string la chaine d'information sur l'espace mémoire occupé ou bien null si echo
97: */
98: public static function tailleMemoireVar($var, $mot_cle = null, $echo = false) {
99: $memoire_depart = memory_get_usage();
100: $temp = unserialize(serialize($var));
101: $taille = memory_get_usage() - $memoire_depart;
102: $sortie = Fichier::convertirTaille($taille);
103: return self::traiterDebogage($mot_cle, $sortie, $echo);
104: }
105:
106: /**
107: * Affichage d'informations sur l'espace mémoire occupé par le script PHP
108: *
109: * @link http://forum.webmaster-rank.info/developpement-site/code-taille-memoire-d-une-variable-en-php-t1344.html
110: * @since 0.3
111: *
112: * @param string $mot_cle le mot cle à associer
113: * @param boolean $echo faire un echo ou non
114: *
115: * @return string la chaine d'information sur l'espace mémoire occupé ou bien null si echo
116: */
117: public static function tailleMemoireScript($mot_cle = null, $echo = false) {
118: $sortie = 'Mémoire -- Utilisé : '.Fichier::convertirTaille(memory_get_usage(false)).
119: ' || Alloué : '.
120: Fichier::convertirTaille(memory_get_usage(true)) .
121: ' || MAX Utilisé : '.
122: Fichier::convertirTaille(memory_get_peak_usage(false)).
123: ' || MAX Alloué : '.
124: Fichier::convertirTaille(memory_get_peak_usage(true)).
125: ' || MAX autorisé : '.
126: ini_get('memory_limit');
127:
128: // Traitement général du débogage
129: return self::traiterDebogage($mot_cle, $sortie, $echo);
130: }
131:
132: /**
133: * Traite une chaine de débogage et les mots clés associés
134: * @param string $mot_cle le mot à associer à la chaine
135: * @param string $sortie le chaine de debogage
136: * @param boolean $echo faire un echo du resultat ou non
137: * @return string la chaine de debogage formatée ou bien null si echo
138: */
139: private static function traiterDebogage($mot_cle, $sortie, $echo) {
140: Config::verifierPresenceParametres(self::$parametres_obligatoires);
141: $debogage = Config::get('debogage');
142: $mode = Config::get('debogage_mode');
143:
144: $mot_cle = self::formaterMotCle($mot_cle);
145: $sortie = self::traiterSortieSuivantMode($mot_cle, $sortie);
146:
147: // Affichage et/ou retour
148: if ($debogage == true) {
149: if ($echo === true || $mode == self::MODE_ECHO) {
150: echo $sortie;
151: return null;
152: } else if ($mode == self::MODE_NOTICE || $mode == self::MODE_ENTETE_HTTP) {
153: trigger_error($sortie, E_USER_NOTICE);
154: return null;
155: } else {
156: return $sortie;
157: }
158: }
159: }
160:
161: /**
162: * formate un mot clé donné
163: * @param string $mot_cle le mot clé à formaté
164: * @return string le mot clé formaté ou bien un chaine vide le mot clé est null ou vide
165: */
166: private static function formaterMotCle($mot_cle) {
167: return ($mot_cle === null) ? '' : rtrim($mot_cle).' ';
168: }
169:
170: /**
171: * traite la sortie de la chaine de débogage suivant le mode de php
172: * @param string $mot_cle le mot clé associé à la chaine
173: * @param string $sortie la chaine de débogage
174: * @return string la sortie formatée pour le mode en cours
175: */
176: private static function traiterSortieSuivantMode($mot_cle, $sortie) {
177: $mode_actuel = Config::get('debogage_mode');
178: if ($mode_actuel == self::MODE_ENTETE_HTTP) {
179: $cle = (empty($mot_cle)) ? 'message' : $mot_cle;
180: $sortie = "$cle:$sortie";
181: } else {
182: $corps = $mot_cle.PHP_EOL.$sortie;
183: if (self::getMode() == 'cli') {
184: $sortie = PHP_EOL.$corps.PHP_EOL;
185: } else {
186: $sortie = '<pre>'.$corps.'</pre>';
187: }
188: }
189: return $sortie;
190: }
191: }
192: ?>