Les aides au débuggage de squelettes

SPIP propose nativement quelques fonctionnalités pour venir en aide au webmestre lors de la phase de débuggage (ou débogage) des squelettes.
Ces fonctions d’information sont accessibles en passant des variables spécifiques dans l’url de la page appelée.

  • Apparu en : SPIP 2.0

Les « var_mode » et « var_profile » s’utilisent en ajoutant soit ?var_mode=... (ex : -titre-de-rubrique-?var_mode=...), soit &var_mode=... (ex : spip.php?article3&var_mode=...) à l’url de la page appelée.
Leur utilisation n’est fonctionnelle que pour les administrateurs loggés.

var_mode=calcul et var_mode=recalcul

L’appel de « var_mode=calcul » regénère le code html (recompile les squelettes requis si ils ont été modifiés depuis leur dernière compilation, puis lance l’exécution du code compilé) et rafraîchit le cache (crée les fichiers html qui n’auront plus qu’à être lus lors des prochains appels de la page).

L’appel de « var_mode=recalcul » regénère le code php (effectue une nouvelle compilation des squelettes requis pour la page), puis regénère le code html (lance l’exécution du code qui vient d’être compilé) et enfin rafraîchit les caches (crée les fichiers html qui n’auront plus qu’à être lus lors des prochains appels de la page). Les caches des squelettes non requis pour la page recalculée ne sont pas invalidés.

Le recalcul de la page regénère aussi les css et scripts javascript compressés.
Le recalcul ne s’applique pas aux images (vignettes, images-typo, ...)

Ces deux appels peuvent être lancés par un clic sur l’un des boutons d’administration ;

var_mode=calcul

un premier clic appelant « var_mode=calcul » (lorsque l’intitulé du bouton est accompagné d’une étoile, c’est que la page affichée est lue depuis le cache) ;

var_mode=calcul

un second clic appelant « var_mode=recalcul ».

Attention : On pourrait être tenté d’utiliser &var_mode=recalcul dans des liens de ses squelettes (pour forcer la mise à jour de css ou javascript par exemple). C’est une trés mauvaise pratique à éviter car consommatrice de ressources serveur (re-compilation du squelette).

var_mode=images

L’appel de « var_mode=images » permet de recalculer les images et vignettes générées par les filtres graphiques dans la page en cours.

var_mode=inclure

L’appel de « var_mode=inclure » affiche le nom et le chemin de chaque noisette (inclure ou modèle) qui compose la page.

Ceci permet de vérifier que les inclure réellement appelés par le squelette de la page sont bien ceux que l’on y a spécifiés.

var_mode=inclure

var_profile=1

L’appel de « var_profile=1 » affiche le détail des requêtes sql et les temps de calcul de chacune. Les requêtes sont classées de la plus gourmande en temps d’exécution à la plus rapide.

Cette fonction est particulièrement utile pour comprendre ce qui peut rendre une page excessivement lente à s’afficher.
Elle permet de visualiser les requêtes sql générées par chaque boucle du squelette (y compris les squelettes inclus) ainsi que les requêtes hors boucle (notées « Hors Compilation ») générées par SPIP.

var_profile

On peut y relever :

  • pour chaque boucle
    • le nombre de fois où la boucle (donc la requête sql) a été exécutée,
    • le temps (en secondes) pris par la boucle (c’est à dire le temps de la requête correspondante multiplié par le nombre d’exécutions de la boucle),
    • la liste (triée par ordre chronologique de toutes les requêtes générées par la page) de chaque exécution de la requête (qui sert de lien vers le détail de chaque requête).
  • les requêtes hors boucle
  • le temps total pris par l’ensemble des requêtes pour la page
  • le détail de chaque requête effectuée avec
    • un tableau statistique affichant l’explication de la requête,
    • l’intitulé de la requête.

Attention :
var_profile donnera des résultats différents selon qu’on demande le calcul de la page ou non.
-  Pensez à demander le calcul de la page (&var_profile=1&var_mode=calcul) pour obtenir les résultats associés au calcul de toute la page et de ses inclusions.
-  Si vous ne demandez pas le calcul, vous obtiendrez beaucoup moins de résultats, car les HTML fournis proviennent des résultats mis en cache, sans interrogation de la BDD. Vous verrez toutefois les requêtes qui restent actives pour toutes les pages servies, même lorsqu’il n’y a pas de calcul nécessaire.

var_mode=preview

L’appel de « var_mode=preview » depuis l’espace privé permet de visualiser dans l’espace public un article de statut « proposé à la publication » sans avoir besoin de le publier.

var_mode=preview

var_mode=urls

L’appel de « var_mode=urls » force la mise à jour de toutes les urls de la page.

var_mode=debug

L’appel de « var_mode=debug » détaille la génération d’une page (boucles spip - requêtes sql - code php - statistiques des requêtes sql).

var_mode=debug

Cette page affiche pour le squelette principal ainsi que pour chacun des squelettes inclus

  • la liste des valeurs des variables de contexte (#ENV) passées par le squelette appelant,
  • la liste des boucles.

Les différents liens permettent d’accèder à :

  • Squelette
    le code texte du squelette (évite ainsi d’avoir accès au fichier .html pour en lire le contenu),
    • résultat
      le code généré par ce squelette spécifiquement (hors inclusions éventuelles) qui, une fois évalué, retournera du html au navigateur,
    • code
      le code php généré par le compilateur (analyse plutôt destinée aux développeurs avertis) qui, une fois exécuté, produira le résultat (voir ci-dessus),
    • calcul
      le détail des requêtes sql et, pour chacune, les temps de calcul (voir ci-dessus var_profile).
  • boucle
    le code texte de la boucle complète (de <B_abc> à <//B_abc>),
    • résultat
      la requête sql générée par la boucle étudiée,
      une liste des premiers résultats retournés par cette requête [1],
    • code
      le code php (généré par le compilateur) de la fonction spécifique associée à cette boucle (analyse plutôt destinée aux développeurs avertis),
    • calcul
      le détail et les temps de calcul de la requête sql associée à cette boucle (voir ci-dessus var_profile).

var_mode=traduction

Le paramètre var_mode=traduction permet d’analyser les chaînes de langue utilisées dans une page. Lors de son utilisation, les chaînes de langue présentes dans la page sont mise en évidence :

  • les chaînes de langue traduites sont surlignées, une bulle d’info donnant l’item source et la langue de traduction est affichée lors du survol de la chaîne
  • les chaînes de langue inexistantes clignotent en rouge.
var_mode=traduction

Débloquer SVP

Il y a 2 var_mode exploitables dans SVP (sur la page d’admin des plugins) :

-  var_mode=vider_paquets_locaux indique à SVP de forcer un recalcul de ses informations en base pour ce qui concerne les plugins locaux donc (plugins/ , plugins-dist/).

-  var_mode=reinstaller_svp est encore plus bourrin : il désinstalle SVP (il se réinstallera au prochain tour).

Donc, si c’est un problème de lecture par SVP, le premier devrait corriger ça (ça arrivait dans des cas rares, mais normalement on devrait plus en avoir besoin). Le second évidemment nécessite de reconfigurer SVP par la suite (dépots de plugins & conf si elle avait été changé…)

Page blanche ?!

Certaines erreurs PHP peuvent provoquer une page blanche sur la partie publique comme sur la partie privée de votre site.

Dans ce cas, vous devez ajouter le code suivant dans Le fichier mes_options.php :

// Activer les rapports d’erreurs PHP
error_reporting(E_ALL^E_NOTICE);
ini_set ("display_errors", "On");

// Afficher toutes les erreurs dans SPIP
define('SPIP_ERREUR_REPORT', E_ALL);

…puis relancer votre page. Elle devrait alors afficher un message d’erreur PHP indiquant la cause exacte du problème.

Important : si c’est un site en production, il faudra supprimer ces lignes une fois le problème résolu.

Ou bien, pour simplement logger les erreurs dans /tmp/log/php.log sans les afficher, ajouter ceci dans Le fichier mes_options.php :

ini_set("log_errors", 1);
ini_set("error_log", $_SERVER['DOCUMENT_ROOT'] . '/tmp/log/php.log');

Obtenir encore plus d’informations pour le debogage

Voici des options utiles au debogage que vous pouvez activer dans Le fichier mes_options.php :

Nom de la constanteValeursDescription
_NO_CACHE -1,0,1 Désactiver le cache
_INTERDIRE_COMPACTE_HEAD_ECRIRE false,true Désactiver les caches CSS et Javascript
SPIP_ERREUR_REPORT E_ALL Afficher toutes les erreurs dans SPIP
$GLOBALS[’taille_des_logs’] valeur en ko Taille des logs
_MAX_LOG nombre de lignes Limite la taille des logs à n lignes
_LOG_FILELINE false,true Ajouter dans les logs le fichier, la ligne et le nom de la fonction d’où le log est généré
_LOG_FILTRE_GRAVITE 1 à 8 Verbosité des logs
_DEBUG_SLOW_QUERIES false/true Log SQL
_BOUCLE_PROFILER valeur en ms Suivre les boucles qui requiert plus de n ms

- Désactiver le cache de SPIP

define('_NO_CACHE', -1);

ou en cliquant sur le bouton : "Désactiver temporairement le cache"

- Désactiver les caches CSS et Javascript (fichiers se trouvant dans local/cache-js/ et local/cache-css/

define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', true);


-  Activer les rapports d’erreurs PHP

error_reporting(E_ALL^E_NOTICE);
ini_set ("display_errors", "On");

-  Afficher toutes les erreurs dans SPIP

define('SPIP_ERREUR_REPORT',E_ALL);

-  Augmenter la taille des logs à 500 ko

$GLOBALS['taille_des_logs'] = 500;

-  Limite la taille des logs à 500000 lignes

define('_MAX_LOG', 500000);

-  Ajouter dans les logs le fichier, la ligne et le nom de la fonction d’où le log est généré.

define('_LOG_FILELINE',true);

-  Avoir tous les logs

define('_LOG_FILTRE_GRAVITE',8);

-  Indiquer dans les logs de MySQL (log/mysql-slow.log) l’URL correspondant aux requêtes « lentes » :

define('_DEBUG_SLOW_QUERIES', true);

-  Suivre les boucles demandant plus de 5 secondes (5000 ms) pour s’exécuter

define('_BOUCLE_PROFILER', 5000);

 


Pour résumer à utiliser UNIQUEMENT sur un site en DÉVELOPPEMENT, vous pouvez copier/coller tout ceci dans Le fichier mes_options.php :

define('_NO_CACHE', -1);
define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', true);
error_reporting(E_ALL^E_NOTICE);
ini_set ("display_errors", "On");
define('SPIP_ERREUR_REPORT',E_ALL);
$GLOBALS['taille_des_logs'] = 500;
define('_MAX_LOG', 500000);
define('_LOG_FILELINE',true);
define('_LOG_FILTRE_GRAVITE',8);
define('_DEBUG_SLOW_QUERIES', true);
define('_BOUCLE_PROFILER', 5000);

Notes

[1il est possible de modifier le nombre de résultats affichés ici en plaçant dans le fichier mes_options.php du répertoire config/ la ligne : define('_MAX_DEBUG_AFF', 'n');
(par défaut, pour éviter l’affichage de centaines de retours sur des boucles trop génériques, la valeur « n » de cette constante est fixée à 50).

Portfolio

Voir aussi :

Auteur denisb Publié le : Mis à jour : 04/11/24

Traductions : عربي, English, français, Nederlands, українська