From ca7e501d5b6f9d8be057b73675da93c7f5fd2070 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Tue, 21 Sep 2004 15:35:37 +0000 Subject: [PATCH] centralisation des erreurs dans le debuger --- inc-admin.php3 | 100 ++++++++++-------------------------- inc-balises.php3 | 1 - inc-calcul.php3 | 88 ++++++++++++++------------------ inc-chercher.php3 | 13 ++--- inc-compilo-index.php3 | 2 + inc-public-global.php3 | 8 +-- inc-public.php3 | 112 ++++++++++++++++++++++------------------- 7 files changed, 136 insertions(+), 188 deletions(-) diff --git a/inc-admin.php3 b/inc-admin.php3 index 9a2db8b372..ce88a9052a 100644 --- a/inc-admin.php3 +++ b/inc-admin.php3 @@ -5,10 +5,6 @@ if (defined("_INC_ADMIN")) return; define("_INC_ADMIN", "1"); - -$debug_messages = ''; - - // // Afficher un bouton admin // @@ -92,10 +88,6 @@ function afficher_boutons_admin($pop='', $forcer_debug = false /* cas ou l'eval( $ret .= bouton_admin(_L('Debug'), $link->getUrl()); } } - - // Messages de debug - global $debug_messages; - $ret .= $debug_messages; } $ret .= "</ul></div></div>\n"; @@ -139,7 +131,7 @@ function calcul_admin_page($cached, $texte) { } // -// Leve un drapeau si le squelette donne une page generant de graves erreurs php +// Appelee si le squelette donne une page generant des erreurs // function spip_error_handler ($errno, $errmsg, $filename, $linenum, $vars) { global $tableau_des_erreurs, $page; @@ -169,6 +161,8 @@ function spip_error_handler ($errno, $errmsg, $filename, $linenum, $vars) { } } +// affiche qq lignes de source autour de l'erreur + function affiche_contexte_erreur($texte) { $tableau = explode("\n", $texte); $format = "%0".strlen(count($tableau))."d"; @@ -182,23 +176,25 @@ function affiche_contexte_erreur($texte) { // // Si le code php produit des erreurs, on les affiche en surimpression -// +// sauf pour un visiteur non admin, ou on lui dit que c'est en travaux +// ajouter &var_debug=oui pour voir les erreurs et en parler sur spip@rezo.net + function affiche_erreurs_execution_page() { - global $tableau_des_erreurs, $page_principale, $affiche_boutons_admin; - echo "<div style='height: 100%; width: 100%; position: absolute; z-index: 1000; background-color: pink;'>"; + global $tableau_des_erreurs, $affiche_boutons_admin; + echo "<div style='height: 100%; width: 100%; position: absolute; top: 10px; z-index: 1000; background-color: pink;'>"; if (!$affiche_boutons_admin) echo "<h2>",(_T('info_travaux_titre')), "</h2>"; else { echo "<h2>", - _L("Erreur lors de l'exécution du squelette"), + _L("Squelette invalide"), "</h2>", "<p>", - _L("php a rencontré les erreurs suivantes :"), + _L("PHP a rencontré les erreurs suivantes :"), "<code><ul>"; foreach ($tableau_des_erreurs as $err) { - echo "<li>$err[2] $err[3] $err[1] ($err[0])"; - echo "<small>$err[4]</small>"; - echo "</li>\n"; + echo "<li>$err[2] $err[3] $err[1]", + "<small>$err[4]</small><br><br>", + "</li>\n"; } echo "</ul></code>"; $GLOBALS['bouton_admin_debug'] = true; @@ -214,9 +210,6 @@ function erreur_requete_boucle($query, $id_boucle, $type) { global $auteur_session, $HTTP_COOKIE_VARS, $dir_ecrire; include_ecrire("inc_presentation.php3"); - // Drapeau pour interdire d'ecrire les fichiers dans le cache - define('spip_erreur_fatale', 'requete_boucle'); - // Calmer le jeu avec MySQL (si jamais on est en saturation) @touch($dir_ecrire.'data/mysql_out'); // pour spip_cron @touch($dir_ecrire.'data/lock'); // lock hebergeur @@ -255,41 +248,30 @@ function erreur_requete_boucle($query, $id_boucle, $type) { spip_log("Erreur MySQL BOUCLE$id_boucle (".$GLOBALS['fond'].".html)"); } - spip_error_handler(1,$retour,'','','?'); + spip_error_handler(1,$retour,'','',''); } // -// Erreur au parsing des squelettes : afficher le code fautif +// Erreur de syntaxe des squelettes : afficher le code fautif // function erreur_squelette($message, $lieu) { - global $auteur_session, $debug_messages; + global $auteur_session; static $runs; - // Drapeau pour interdire d'ecrire les fichiers dans le cache - # define('spip_erreur_fatale', 'erreur_squelette'); - # En fait, a partir du moment ou l'erreur est dans le squelette, - # ca ne change rien et autant cacher quand meme ! - spip_log("Erreur squelette: $message | $lieu (" . $GLOBALS['fond'].".html)"); $GLOBALS['bouton_admin_debug'] = true; - - // Pour un visiteur normal, ne rien afficher, si SPIP peut s'en sortir - // tant mieux, sinon l'erreur se verra de toutes facons :-( - // ajouter &var_debug=oui pour discuter sur spip@rezo.net - if ($HTTP_COOKIE_VARS['spip_admin'] OR $auteur_session - OR $GLOBALS['var_debug']) { - $message_long = "<h2>"._T('info_erreur_squelette')."</h2><p>$message</p>"; - $message_long .= '<br /><FONT color="#FF000">' . $lieu . '</FONT>'; - - $debug_messages .= "<div style='position: fixed; top: 10px; left: 10px; - z-index: 10000; background-color: pink;'>$message_long</div>"; - } - - // Eviter les boucles infernales - if (++$runs > 4) die ($debug_messages); spip_error_handler(1," $message $lieu ", '','','?'); + // Eviter les boucles infernales + if (++$runs > 4) { + if (!$HTTP_COOKIE_VARS['spip_admin'] AND + !$auteur_session AND + !$GLOBALS['var_debug']) + $messages = "<h2>".(_T('info_travaux_titre')). "</h2>"; + die ("<div style='position: fixed; top: 10px; left: 10px; + z-index: 10000; background-color: pink;'>$message</div>"); + } } // @@ -331,10 +313,9 @@ function boucle_debug ($id, $nom, $boucle) { // l'environnement graphique du debuggueur function debug_dumpfile ($texte) { - global $flag_ob; global $debug_objets, $debug_objet, $debug_affiche; - - @header("Content-Type: text/html; charset=".lire_meta('charset')); + if (!headers_sent()) + header("Content-Type: text/html; charset=".lire_meta('charset')); if (!$GLOBALS['debug_objets']['sourcefile']) return; spip_setcookie('spip_debug', 'oui', time()+12*3600); $page = "<html><head><title>Debug</title></head>\n<body>"; @@ -401,31 +382,4 @@ function debug_dumpfile ($texte) { if ($texte) exit; } - -/* -function verifie_cookie_debug() { - global $code_activation_debug; - - if ($GLOBALS['HTTP_COOKIE_VARS']['spip_debug'] - != $code_activation_debug) { - spip_setcookie('spip_debug', $code_activation_debug, time()+3600); - include_ecrire('inc_presentation.php3'); - install_debut_html(_L('Bienvenue dans le debuggueur de SPIP')); - echo "<P>"._L("Cet outil vous permet d'analyser les pages produites par - SPIP. Il est parfois de lecture difficile, mais il offre en contrepartie - une grande capacité de recherche des erreurs, et une meilleure - compréhension du fonctionnement des boucles et balises du - système.</p>"); - echo "<P>"._L("Pour entrer, il vous suffit de recharger cette page, - après avoir accepté un cookie (ce dernier permet - d'écarter les moteurs de recherche, et installe un bouton - d'administration supplémentaire «debug» sur - votre écran, pendant une heure).</p>"); - install_fin_html(); - exit; - } else - return true; -} -*/ - ?> diff --git a/inc-balises.php3 b/inc-balises.php3 index 42f22fcf59..0cd4351d32 100644 --- a/inc-balises.php3 +++ b/inc-balises.php3 @@ -776,7 +776,6 @@ function balise_distante_interdite($p) { if ($p->boucles[$nom]->sql_serveur) { include_local("inc-admin.php3"); erreur_squelette($p->nom_champ ._L(" distant interdit"), $nom); - exit; } } diff --git a/inc-calcul.php3 b/inc-calcul.php3 index 00ada2a172..798b7c2d2a 100644 --- a/inc-calcul.php3 +++ b/inc-calcul.php3 @@ -47,7 +47,8 @@ function squelette_obsolete($skel, $squelette) { } -# Charge un squelette (au besoin le compile) +# Charge un squelette (au besoin le compile) +# et retoune le nom de sa fonction principale, ou '' s'il est indefini # Charge egalement un fichier homonyme de celui du squelette # mais de suffixe '_fonctions.php3' pouvant contenir: # - des filtres @@ -87,37 +88,26 @@ function charger_squelette ($squelette) { if (file_exists($f)) include($f); if (function_exists($nom)) return $nom; + $skel_code = calculer_squelette($skel, $nom, $ext, $sourcefile); + // Tester si le compilateur renvoie une erreur - if (is_array($skel_code)) - { - erreur_squelette($skel_code[0], $skel_code[1]) ; - $skel_compile = ''; - $skel_code = ''; - } - else - $skel_compile = "<"."?php\n" . $skel_code ."\n?".">"; - - // Parler au debugguer - if ($GLOBALS['var_debug'] AND - $GLOBALS['debug_objet'] == $nom - AND $GLOBALS['debug_affiche'] == 'code') - debug_dumpfile ($skel_compile); - - // Evaluer le squelette - eval($skel_code); - if (function_exists($nom)) { - ecrire_fichier ($phpfile, $skel_compile); - return $nom; + if (!is_array($skel_code)) { +// Parler au debugguer + if ($GLOBALS['var_debug'] AND + $GLOBALS['debug_objet'] == $nom AND + $GLOBALS['debug_affiche'] == 'code') + debug_dumpfile ($skel_code); + eval($skel_code); + if (function_exists($nom)) { + ecrire_fichier ($phpfile, + "<"."?php\n" . $skel_code ."\n?".">"); + return $nom; + } } - - // en cas d'erreur afficher les boutons de debug - echo "<hr /><h2>". - _L("Erreur dans la compilation du squelette"). - " $sourcefile</h2>" . - $GLOBALS['bouton_admin_debug'] = true; - debug_dumpfile ($skel_compile); + erreur_squelette($skel_code[0], $skel_code[1]) ; + return ''; } # Provoque la recherche du squelette $fond d'une $lang donnee, @@ -129,7 +119,7 @@ function charger_squelette ($squelette) { # En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines -# La recherche est assuree par la fonction cherche_squelette, +# La recherche est assuree par la fonction chercher_squelette, # definie dans inc-chercher, fichier non charge si elle est deja definie # (typiquement dans mes_fonctions.php3) @@ -146,26 +136,25 @@ function cherche_page ($cache, $contexte, $fond, $id_rubrique, $lang='') { $lang); // Charger le squelette et recuperer sa fonction principale - // (compilation automatique au besoin) - - $fonc = charger_squelette($skel); + // (compilation automatique au besoin) et calculer - // Calculer la page a partir du main() du skel compile - $page = $fonc(array('cache' => $cache), array($contexte)); + if ($skel) { + if ($fonc = charger_squelette($skel)); + $page = $fonc(array('cache' => $cache), array($contexte)); - // Passer la main au debuggueur) - if ($GLOBALS['var_debug'] AND $GLOBALS['debug_objet'] == $fonc - AND $GLOBALS['debug_affiche'] == 'resultat') { - debug_dumpfile ($page['texte']); + // Passer la main au debuggueur) + if ($GLOBALS['var_debug'] AND + $GLOBALS['debug_objet'] == $fonc AND + $GLOBALS['debug_affiche'] == 'resultat') + debug_dumpfile ($page['texte']); } - # flag pour spip_error_handler(), cf inc-admin ?? $page['squelette'] = $skel; // Nettoyer le resultat si on est fou de XML if ($GLOBALS['xhtml']) { - include_ecrire("inc_tidy.php"); - $page['texte'] = xhtml($page['texte']); + include_ecrire("inc_tidy.php"); + $page['texte'] = xhtml($page['texte']); } // Entrer les invalideurs dans la base @@ -332,7 +321,7 @@ function spip_abstract_select ( $d = 'inc_connect-' . $serveur .'.php3'; if (file_exists('ecrire/' . $d)) include_ecrire($d); - serveur_defini($f, $serveur); + $f = spip_abstract_serveur($f, $serveur); } } return $f($select, $from, $where, @@ -341,12 +330,13 @@ function spip_abstract_select ( $table, $id, $serveur); } -function serveur_defini($f, $serveur) { +function spip_abstract_serveur($f, $serveur) { if (function_exists($f)) return $f; include_local("inc-admin.php3"); - erreur_squelette(_T('info_erreur_squelette'), - $serveur . - _L(' serveur SQL indefini')); + erreur_squelette(_L(' serveur SQL indefini'), $serveur); + + // hack pour continuer la chasse aux erreurs + return 'array'; } // Les 3 fonctions suivantes exploitent le resultat de la precedente, @@ -355,21 +345,21 @@ function serveur_defini($f, $serveur) { function spip_abstract_fetch($res, $serveur='') { if (!$serveur) return spip_fetch_array($res); - $f = serveur_defini('spip_' . $serveur . '_fetch', $serveur); + $f = spip_abstract_serveur('spip_' . $serveur . '_fetch', $serveur); return $f($res); } function spip_abstract_count($res, $serveur='') { if (!$serveur) return spip_num_rows($res); - $f = serveur_defini('spip_' . $serveur . '_count', $serveur); + $f = spip_abstract_serveur('spip_' . $serveur . '_count', $serveur); return $f($res); } function spip_abstract_free($res, $serveur='') { if (!$serveur) return spip_free_result($res); - $f = serveur_defini('spip_' . $serveur . '_free', $serveur); + $f = spip_abstract_serveur('spip_' . $serveur . '_free', $serveur); return $f($res); } diff --git a/inc-chercher.php3 b/inc-chercher.php3 index 910304f02c..eac2ee6a28 100644 --- a/inc-chercher.php3 +++ b/inc-chercher.php3 @@ -37,15 +37,10 @@ function chercher_squelette($fond, $id_rubrique, $dossier, $lang) { return "$fond-dist"; } else { // erreur webmaster : $fond ne correspond a rien - include_ecrire ("inc_presentation.php3"); - install_debut_html(_T('info_erreur_squelette')); - echo "<p>", - _T('info_erreur_squelette2', - array('fichier'=>$fond)), - "</p>"; - spip_log("ERREUR: squelette '$fond' indisponible"); - install_fin_html(); - exit; + erreur_squelette(_T('info_erreur_squelette2', + array('fichier'=>$fond)), + $dossier); + return ''; } } diff --git a/inc-compilo-index.php3 b/inc-compilo-index.php3 index 1f9bbb7d75..a2d6e3ce84 100644 --- a/inc-compilo-index.php3 +++ b/inc-compilo-index.php3 @@ -48,6 +48,8 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite='') { if (!$desc) { include_local("inc-admin.php3"); erreur_squelette(_L("Table SQL \"$r\" inconnue"), "'$idb'"); + # continuer pour chercher l'erreur suivante + return "'#" . $r . ':' . $nom_champ . "'"; } $excep = $exceptions_des_tables[$r][$c]; if ($excep) { diff --git a/inc-public-global.php3 b/inc-public-global.php3 index 2d3f6c80bc..b313dc0261 100644 --- a/inc-public-global.php3 +++ b/inc-public-global.php3 @@ -20,8 +20,8 @@ function obtenir_page ($contexte, $chemin_cache, $delais, $use_cache, $fond, $in spip_timer('calculer_page'); $page = calculer_page($chemin_cache, - array('fond' => $fond, - 'contexte' => $contexte), + array('fond' => $fond, + 'contexte' => $contexte), $delais, $inclusion); @@ -37,9 +37,11 @@ function obtenir_page ($contexte, $chemin_cache, $delais, $use_cache, $fond, $in // qu'il faut changer d'invalideur a la prochaine lecture et donner // un invalideur 't' dans 1 heure // NB: cet invalideur connait aussi la taille du fichier - if ($fichier = addslashes($chemin_cache)) { + spip_log("cache" . $page['process_ins']); + if (file_exists($chemin_cache)) { $bedtime = time() + 3600; $taille = @filesize($chemin_cache); + $fichier = addslashes($chemin_cache); spip_query("INSERT IGNORE INTO spip_caches (fichier,id,type,taille) VALUES ('$fichier','$bedtime','t','$taille')"); @touch($chemin_cache.'.NEW'); diff --git a/inc-public.php3 b/inc-public.php3 index 73c66f106e..ec1c808112 100644 --- a/inc-public.php3 +++ b/inc-public.php3 @@ -3,11 +3,16 @@ // Page inclue ? if (defined("_INC_PUBLIC")) { $page = inclure_page($fond, $delais, $contexte_inclus, $fichier_inclus); - + $contenu = $page['texte']; + // Traiter var_recherche pour surligner les mots + if ($GLOBALS['var_recherche']) { + include_ecrire("inc_surligne.php3"); + $contenu = surligner_mots($contenu, $var_recherche); + } if ($page['process_ins'] == 'php') { - eval('?' . '>' . $page['texte']); // page 'php' + eval('?' . '>' . $contenu); // page 'php' } else - echo $page['texte']; // page tout 'html' + echo $contenu; // page tout 'html' if ($page['lang_select']) lang_dselect(); @@ -93,81 +98,82 @@ else { $tableau_des_erreurs = array(); $page = afficher_page_globale ($fond, $delais, $use_cache); - // Afficher la page ; le cas PHP est assez rigolo avec le traitement - // d'erreurs - if ($page['process_ins'] == 'php') { + // Interdire au client de cacher un login, un admin ou un recalcul + if ($flag_dynamique OR ($recalcul == 'oui') + OR $HTTP_COOKIE_VARS['spip_admin']) { + @header("Cache-Control: no-cache,must-revalidate"); + @header("Pragma: no-cache"); + // Pour les autres donner l'heure de modif + } else if ($lastmodified) + @Header ("Last-Modified: ".http_gmoddate($lastmodified)." GMT"); + + @header("Content-Type: text/html; charset=".lire_meta('charset')); + #entre gzip et debug, faut revoir + #@header('Content-Length: '.strlen($contenu)); +# @header('Connection: close'); + + $contenu = $page['texte']; + spip_log($page['process_ins'] . strlen($contenu)); + // Traiter var_recherche pour surligner les mots + if ($var_recherche) { + include_ecrire("inc_surligne.php3"); + $contenu = surligner_mots($contenu, $var_recherche); + } + + // Ajouter les boutons admins (les normaux) + if ($affiche_boutons_admin) + $contenu = calcul_admin_page($use_cache, $contenu); + spip_log($page['process_ins'] . $contenu); + + if ($page['process_ins'] == 'html') + {if (!$var_debug) echo $contenu;} + else { // Ici on va ruser pour intercepter les erreurs (meme les FATAL) // dans le eval : on envoie le bouton debug, et on le supprime // de l'autre cote ; de cette facon, si on traverse sans encombre, // on est propre, et sinon on a le bouton - if ($affiche_boutons_admin) { + if ($affiche_boutons_admin) { - // recuperer les parse errors etc., type "FATAL" (cf. infra) - if ($auteur_session['statut'] == '0minirezo') { + // recuperer les parse errors etc., type "FATAL" (cf. infra) + if ($auteur_session['statut'] == '0minirezo') { $page_principale = $page; if (function_exists('set_error_handler')) set_error_handler('spip_error_handler'); + } + } - } - // // Evaluer la page php // - if (!$var_debug) - $res = eval('?' . '>' . $page['texte']); - else { - ob_start(); - $res = eval('?' . '>' . $page['texte']); - $contenu = ob_get_contents(); - ob_end_clean(); - } + if (!$var_debug) + $res = eval('?' . '>' . $contenu); + else { + ob_start(); + $res = eval('?' . '>' . $contenu); + $contenu = ob_get_contents(); + ob_end_clean(); + } // en cas d'erreur afficher un message + demander les boutons de debug - if ($affiche_boutons_admin - AND $auteur_session['statut'] == '0minirezo') { - if (function_exists('restore_error_handler')) - restore_error_handler(); - if ($res === false) - spip_error_handler(1,'erreur de compilation','','',''); + if ($affiche_boutons_admin + AND $auteur_session['statut'] == '0minirezo') { + if (function_exists('restore_error_handler')) + restore_error_handler(); + if ($res === false) + spip_error_handler(1,'erreur de compilation','','',''); + } + } - - } else $contenu = $page['texte']; - // Passer la main au debuggueur le cas echeant if ($var_debug) debug_dumpfile(''); else { if (count($tableau_des_erreurs) > 0) affiche_erreurs_execution_page (); - - // Traiter var_recherche pour surligner les mots - if ($var_recherche) { - include_ecrire("inc_surligne.php3"); - $contenu = surligner_mots($contenu, $var_recherche); - } - - // Ajouter les boutons admins (les normaux) - if ($affiche_boutons_admin) - $contenu = calcul_admin_page($use_cache, $contenu); - - // Interdire au client de cacher un login, un admin ou un recalcul - if ($flag_dynamique OR ($recalcul == 'oui') - OR $HTTP_COOKIE_VARS['spip_admin']) { - @header("Cache-Control: no-cache,must-revalidate"); - @header("Pragma: no-cache"); - // Pour les autres donner l'heure de modif - } else if ($lastmodified) - @Header ("Last-Modified: ".http_gmoddate($lastmodified)." GMT"); - - // Afficher (pour de vrai) - @header('Content-Length: '.strlen($contenu)); # ca donne quoi en gzip ? - @header('Connection: close'); - echo $contenu; } - terminer_public_global($use_cache, $page['cache']); } -- GitLab