[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / public / tracer.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 // http://doc.spip.org/@trace_query_start
16 function trace_query_start()
17 {
18 static $trace = '?';
19 if ($trace === '?') {
20 include_spip('inc/autoriser');
21 // gare au bouclage sur calcul de droits au premier appel
22 // A fortiori quand on demande une trace
23 $trace = isset($_GET['var_profile']) AND (autoriser('debug'));
24 }
25 return $trace ? microtime() : 0;
26 }
27
28 // http://doc.spip.org/@trace_query_end
29 function trace_query_end($query, $start, $result, $erreur, $serveur=''){
30 if ($start)
31 trace_query_chrono($start, microtime(), $query, $result, $serveur);
32 // tracer les erreurs, sauf pour select, c'est fait dans abstract_sql
33 if ($erreur AND !preg_match('/^select\b/i', $query))
34 erreur_squelette(array(sql_errno($serveur), $erreur, $query));
35 return $result;
36 }
37
38 // http://doc.spip.org/@trace_query_chrono
39 function trace_query_chrono($m1, $m2, $query, $result, $serveur='')
40 {
41 static $tt = 0, $nb=0;
42 global $tableau_des_temps;
43
44 $x = _request('var_mode_objet');
45 if (isset($GLOBALS['debug']['aucasou'])) {
46 list(, $boucle, $serveur, $contexte) = $GLOBALS['debug']['aucasou'];
47 if ($x AND !preg_match("/$boucle\$/", $x))
48 return;
49 if ($serveur) $boucle .= " ($serveur)";
50 $boucle = "<b>$boucle</b>";
51 } else {
52 if ($x) return;
53 $boucle = $contexte = '';
54 }
55
56 list($usec, $sec) = explode(" ", $m1);
57 list($usec2, $sec2) = explode(" ", $m2);
58 $dt = $sec2 + $usec2 - $sec - $usec;
59 $tt += $dt;
60 $nb++;
61
62 $q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2",htmlentities($query));
63 $e = sql_explain($query, $serveur);
64 $r = str_replace('Resource id ','',(is_object($result)?get_class($result):$result));
65 $tableau_des_temps[] = array($dt, $nb, $boucle, $q, $e, $r, $contexte);
66 }
67
68
69 function chrono_requete($temps)
70 {
71 $total = 0;
72 $hors = "<i>" . _T('zbug_hors_compilation') . "</i>";
73 $t = $q = $n = $d = array();
74 // Totaliser les temps et completer le Explain
75 foreach ($temps as $key => $v) {
76 list($dt, $nb, $boucle, $query, $explain, $res, $contexte) = $v;
77 if (is_array($contexte)) {
78 $k = ($contexte[0] . " $boucle");
79 include_spip('public/compiler');
80 $env = reconstruire_contexte_compil($contexte);
81 } else $k = $env = $boucle;
82
83 $total += $dt;
84 $t[$key] = $dt;
85 $q[$key] = $nb;
86 $d[$k]+= $dt;
87 if ($k) @++$n[$k];
88
89 if (!is_array($explain))
90 $explain = array();
91 foreach($explain as $j => $v) {
92 $explain[$j] = "<tr><th>$j</th><td>"
93 . str_replace(';','<br />',$v)
94 . "</td></tr>";
95 }
96 $e = "<table class='explain'>"
97 . "<caption>"
98 . $query
99 . "</caption>"
100 . "<tr><th>Time</th><td>$dt</td></tr>"
101 . "<tr><th>Order</th><td>$nb</td></tr>"
102 . "<tr><th>Res</th><td>$res</td></tr>"
103 . join('', $explain)
104 . "</table>";
105
106 $temps[$key] = array($e, $env, $k);
107 }
108 // Trier par temps d'execution decroissant
109 array_multisort($t, SORT_DESC, $q, $temps);
110 arsort($d);
111 $i = 1;
112 $t = array();
113 // Fabriquer les liens de navigations dans le tableau des temps
114 foreach($temps as $k => $v) {
115 $titre = strip_tags($v[2]);
116 $href = quote_amp($GLOBALS['REQUEST_URI'])."#req$i";
117
118 $t[$v[2]][]= "<span class='spip-debug-arg'> "
119 . "<a title='$titre' href='$href'>$i</a>"
120 . '</span>'
121 . ((count($t[$v[2]]) % 10 == 9) ? "<br />" : '');
122 $i++;
123 }
124
125 if ($d['']) {
126 $d[$hors] = $d[''];
127 $n[$hors] = $n[''];
128 $t[$hors] = $t[''];
129 }
130 unset($d['']);
131 // Fabriquer le tableau des liens de navigation dans le grand tableau
132 foreach ($d as $k => $v) {
133 $d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>"
134 . join('',$t[$k]);
135 }
136
137 $navigation =
138 _T('zbug_statistiques')
139 . "<table style='text-align: left; border: 1px solid;'><tr><td>"
140 . join("</td></tr>\n<tr><td>", $d)
141 . "</td></tr>\n"
142 . (# _request('var_mode_objet') ? '' :
143 ("<tr><td>" . count($temps) . "</td><td>" . _T('info_total') . '</td><td class="time">' . $total . "</td><td></td></tr>"))
144 . "</table>";
145
146 return array($temps, $navigation);
147 }
148
149 ?>