[SPIP] v3.2.1-->v3.2.2
[lhc/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-2019 *
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')) {
14 return;
15 }
16
17 // http://code.spip.net/@trace_query_start
18 function trace_query_start() {
19 static $trace = '?';
20 if ($trace === '?') {
21 include_spip('inc/autoriser');
22 // gare au bouclage sur calcul de droits au premier appel
23 // A fortiori quand on demande une trace
24 $trace = isset($_GET['var_profile']) and (autoriser('debug'));
25 }
26
27 return $trace ? microtime() : 0;
28 }
29
30 // http://code.spip.net/@trace_query_end
31 function trace_query_end($query, $start, $result, $erreur, $serveur = '') {
32 if ($start) {
33 trace_query_chrono($start, microtime(), $query, $result, $serveur);
34 }
35 // tracer les erreurs, sauf pour select, c'est fait dans abstract_sql
36 if ($erreur and !preg_match('/^select\b/i', $query)) {
37 erreur_squelette(array(sql_errno($serveur), $erreur, $query));
38 }
39
40 return $result;
41 }
42
43 // http://code.spip.net/@trace_query_chrono
44 function trace_query_chrono($m1, $m2, $query, $result, $serveur = '') {
45 include_spip('inc/filtres_mini');
46 static $tt = 0, $nb = 0;
47
48 $x = _request('var_mode_objet');
49 if (isset($GLOBALS['debug']['aucasou'])) {
50 list(, $boucle, $serveur, $contexte) = $GLOBALS['debug']['aucasou'];
51 if ($x and !preg_match("/$boucle\$/", $x)) {
52 return;
53 }
54 if ($serveur) {
55 $boucle .= " ($serveur)";
56 }
57 $boucle = "<b>$boucle</b>";
58 } else {
59 if ($x) {
60 return;
61 }
62 $boucle = $contexte = '';
63 }
64
65 list($usec, $sec) = explode(" ", $m1);
66 list($usec2, $sec2) = explode(" ", $m2);
67 $dt = $sec2 + $usec2 - $sec - $usec;
68 $tt += $dt;
69 $nb++;
70
71 $q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query));
72 $e = sql_explain($query, $serveur);
73 $r = str_replace('Resource id ', '', (is_object($result) ? get_class($result) : $result));
74 $GLOBALS['tableau_des_temps'][] = array($dt, $nb, $boucle, $q, $e, $r, $contexte);
75 }
76
77
78 function chrono_requete($temps) {
79 $total = 0;
80 $hors = "<i>" . _T('zbug_hors_compilation') . "</i>";
81 $t = $q = $n = $d = array();
82 // Totaliser les temps et completer le Explain
83 foreach ($temps as $key => $v) {
84 list($dt, $nb, $boucle, $query, $explain, $res, $contexte) = $v;
85 if (is_array($contexte)) {
86 $k = ($contexte[0] . " $boucle");
87 include_spip('public/compiler');
88 $env = reconstruire_contexte_compil($contexte);
89 } else {
90 $k = $env = $boucle;
91 }
92
93 $total += $dt;
94 $t[$key] = $dt;
95 $q[$key] = $nb;
96 if (!isset($d[$k])) {
97 $d[$k] = 0;
98 $n[$k] = 0;
99 }
100 $d[$k] += $dt;
101 ++$n[$k];
102
103 if (!is_array($explain)) {
104 $explain = array();
105 }
106 foreach ($explain as $j => $v) {
107 $explain[$j] = "<tr><th>$j</th><td>"
108 . str_replace(';', '<br />', $v)
109 . "</td></tr>";
110 }
111 $e = "<table class='explain'>"
112 . "<caption>"
113 . $query
114 . "</caption>"
115 . "<tr><th>Time</th><td>$dt</td></tr>"
116 . "<tr><th>Order</th><td>$nb</td></tr>"
117 . "<tr><th>Res</th><td>$res</td></tr>"
118 . join('', $explain)
119 . "</table>";
120
121 $temps[$key] = array($e, $env, $k);
122 }
123 // Trier par temps d'execution decroissant
124 array_multisort($t, SORT_DESC, $q, $temps);
125 arsort($d);
126 $i = 1;
127 $t = array();
128 // Fabriquer les liens de navigations dans le tableau des temps
129 foreach ($temps as $k => $v) {
130 $titre = strip_tags($v[2]);
131 $href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i";
132
133 if (!isset($t[$v[2]])) {
134 $t[$v[2]] = array();
135 }
136 $t[$v[2]][] = "<span class='spip-debug-arg'> "
137 . "<a title='$titre' href='$href'>$i</a>"
138 . '</span>'
139 . ((count($t[$v[2]]) % 10 == 9) ? "<br />" : '');
140 $i++;
141 }
142
143 if ($d['']) {
144 $d[$hors] = $d[''];
145 $n[$hors] = $n[''];
146 $t[$hors] = $t[''];
147 }
148 unset($d['']);
149 // Fabriquer le tableau des liens de navigation dans le grand tableau
150 foreach ($d as $k => $v) {
151 $d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>"
152 . join('', $t[$k]);
153 }
154
155 $navigation = array(
156 _T('zbug_statistiques'),
157 "<tr><td>"
158 . join("</td></tr>\n<tr><td>", $d)
159 . "</td></tr>\n"
160 . (# _request('var_mode_objet') ? '' :
161 ("<tr><td>" . count($temps) . "</td><td>" . _T('info_total') . '</td><td class="time">' . $total . "</td><td></td></tr>"))
162 );
163
164 return array($temps, $navigation);
165 }