Carnet Wiki

var_debug et var_profile

Version 3 — July 2010 JLuc

L’outil actuel de debug et profilage est appelé lorsqu’on ajoute dans l’url appelée les paramétres suivants :
-  var_mode=debug
-  var_profile=1 ou var_profile=sql
(vérifier)

Sont alors affichés ou accessibles des informations techniques avancées comme :
-  les temps de compilation
-  les temps d’exécution d’exéceution
-  les codes sources SPIP, PHP, (MY)SQL

Ces informations sont affichées pour chaque molécule élémentaire de code spip :
-  boucles
-  inclusions
-  appels de balise en dehors d’une boucle (vérifier)

Limitations techniques

ESJ :

<blockquote class="spip">

Le vocabulaire standard considère que “le temps de compilation” est le temps que met le compilateur à traduire le langage-source (ici le langage des squelettes) dans le langage-cible (ici PHP) et il est de peu d’intérêt ici puisque la compilation intervient rarement en production: une fois compilé, c’est le code PHP qui est exécuté. Le temps intéresant à afficher est le temps d’exécution du code PHP compilé, et c’est ce que veut faire SPIP en mesurant le temps au niveau de la fonction inc_parametrer et non ailleurs.

Malheureusement, le temps qu’il affiche est biaisé de plusieurs manières:

1. par définition, le mode debug recompile tous les squelettes pour être certain d’avoir la dernière version; résultat: le temps d’exécution d’un squelette incluant va être plombé par le temps de compilation des squelettes inclus, bien qu’il ne compte pas son propre temps de compilation.

2. on se sert de la fonction time(), qui donne seulement l’heure qu’il est, autrement dit on mesure la charge globale du serveur, pas le temps CPU spécifique au code PHP exécuté.

3. si un squelette est inclus dans une boucle, le temps affiché par le débusqueur est celui du dernier passage dans la boucle,
non pas le temps cumulé de tous les passages (ça c’est un choix arbitraire qui pourrait être différent, mais il faut en être conscient).

</blockquote>

Différents temps de calculs

Il y a

  1. ) les temps de “recalcul” : compilation des squelettes SPIP afin de créer un cache php.
    cette phase est ensuite suivie du calcul afin d’afficher le résultat
  2. ) les temps de calcul : exécution du cache php calculé en 1) et qui fournit le code HTML
  3. ) les temps de service du cache : simple restitution du précédent calcul du HTML

Les recalculs sont les plus coûteux puisqu’ils partent du code spip.
L’impact global sur un serveur dépend aussi de la fréquence de chacun...

A noter que ce qui est appelé “code HTML” peut contenir des morceaux de php si il y en a dans le squelette. C’est pour cela que cette pratique est fortement déconseillée.

La fréquence des calculs et recalculs dépend des valeurs indiquées dans les instructions #CACHE{} en début de chaque squelette, et des modifications apportées à la base de donnée (création d’article, dépot de forum, ...) qui invalident le cache.

Relevé des compteurs

Simon Camerlo a édité spip.php pour rajouter une mesure de chaque calcul en phase de bench :

&lt;?php
   $begin=time();@@@SPIP_DIFF1@@@
 
 
@@@SPIP_DIFF4@@@/***************************************************************************\
*  SPIP, Systeme de publication pour l'internet                           *
*                                                                         *
*  Copyright (c) 2001-2007                                                *
*  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
*                                                                         *
*  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
*  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/@@@SPIP_DIFF1@@@
 
 
@@@SPIP_DIFF4@@@# ou est l'espace prive ?
@define('_DIR_RESTREINT_ABS', 'ecrire/');
include_once _DIR_RESTREINT_ABS.'inc_version.php';@@@SPIP_DIFF1@@@
 
 
@@@SPIP_DIFF4@@@# rediriger les anciens URLs de la forme page.php3fond=xxx
if (isset($_GET['fond'])) {
   include_spip('inc/headers');
   redirige_par_entete(generer_url_public($_GET['fond']));
}@@@SPIP_DIFF1@@@
 
 
@@@SPIP_DIFF4@@@# au travail...
include _DIR_RESTREINT_ABS.'public.php';@@@SPIP_DIFF1@@@
 
 
@@@SPIP_DIFF4@@@spip_log((time() - $begin) . " s || " . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],'bench');
?>