Skip to content
Extraits de code Groupes Projets
Valider b452d2ec rédigé par Fil's avatar Fil
Parcourir les fichiers

la balise #SESSION

cette balise provoque l'invalidation du cache si la session du visiteur a change : elle garantit donc que le cache est calcule pour ce visiteur et pas un autre (les anonymes partageant la meme session).

son contenu est un tableau (serialize comme #ENV) contenant a ce jour les champs suivants :
id_auteur
nom
login
email
statut
lang
ip_change
hash_env

les deux derniers n'ont pas d'interet, ils sauteront probablement ; il manque la bio, a voir si on l'ajoute ; a noter aucun filtre n'est applique (sauf interdire_scripts pour la securite) : pour afficher proprement Hello World il faut faire
[Hello (#SESSION{nom}|typo)]

n'importe quelle balise peut declencher l'invalideur en invoquant
$p->desc['session'] = true;
parent 35f3d278
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -1389,6 +1389,28 @@ function lang_select ($lang=NULL) { ...@@ -1389,6 +1389,28 @@ function lang_select ($lang=NULL) {
changer_langue($lang); changer_langue($lang);
return $lang; return $lang;
} }
// Renvoie une chaine qui decrit la session courante pour savoir si on peut
// utiliser un cache enregistre pour cette session.
// Par convention cette chaine ne doit pas contenir de caracteres [^0-9A-Za-z]
// Attention on ne peut *pas* inferer id_auteur a partir de la session, qui
// pourrait etre une chaine arbitraire -- ce n'est pas le cas pour l'instant
// http://doc.spip.org/@spip_session
function spip_session() {
static $session;
if (!isset($session)) {
$session = $GLOBALS['auteur_session']
? 'session'
.$GLOBALS['auteur_session']['id_auteur']
.'_'
.$_COOKIE['spip_session']
: '';
}
#spip_log('session: '.$session);
return $session;
}
// //
// Aide, aussi depuis l'espace prive a present. // Aide, aussi depuis l'espace prive a present.
// Surchargeable mais pas d'ereur fatale si indisponible. // Surchargeable mais pas d'ereur fatale si indisponible.
......
...@@ -998,6 +998,8 @@ function balise_CHEMIN_dist($p) { ...@@ -998,6 +998,8 @@ function balise_CHEMIN_dist($p) {
// //
// La syntaxe #ENV{toto, rempl} renverra 'rempl' si $toto est vide // La syntaxe #ENV{toto, rempl} renverra 'rempl' si $toto est vide
// //
// Si le tableau est vide on renvoie '' (utile pour #SESSION)
//
// http://doc.spip.org/@balise_ENV_dist // http://doc.spip.org/@balise_ENV_dist
function balise_ENV_dist($p, $src = NULL) { function balise_ENV_dist($p, $src = NULL) {
// le tableau de base de la balise (cf #META ci-dessous) // le tableau de base de la balise (cf #META ci-dessous)
...@@ -1009,13 +1011,15 @@ function balise_ENV_dist($p, $src = NULL) { ...@@ -1009,13 +1011,15 @@ function balise_ENV_dist($p, $src = NULL) {
if (!$_nom) { if (!$_nom) {
// cas de #ENV sans argument : on retourne le serialize() du tableau // cas de #ENV sans argument : on retourne le serialize() du tableau
// une belle fonction [(#ENV|affiche_env)] serait pratique // une belle fonction [(#ENV|affiche_env)] serait pratique
$p->code = 'serialize('.$src.')'; $p->code = "($src ? serialize($src) : '')";
} else { } else {
// admet deux arguments : nom de variable, valeur par defaut si vide // admet deux arguments : nom de variable, valeur par defaut si vide
$p->code = $src."[$_nom]"; $p->code = 'is_array('.$src.') ? '.$src.'['.$_nom.'] : ""';
if ($_sinon) if ($_sinon)
$p->code = 'sinon('. $p->code = 'sinon('.
$p->code.",$_sinon)"; $p->code.",$_sinon)";
else
$p->code = '('.$p->code.')';
} }
#$p->interdire_scripts = true; #$p->interdire_scripts = true;
...@@ -1039,6 +1043,23 @@ function balise_CONFIG_dist($p) { ...@@ -1039,6 +1043,23 @@ function balise_CONFIG_dist($p) {
return balise_ENV_dist($p, '$GLOBALS["meta"]'); return balise_ENV_dist($p, '$GLOBALS["meta"]');
} }
//
// #SESSION
// Cette balise est un tableau des donnees du visiteur (nom, email etc)
// Si elle est invoquee, elle leve un drapeau dans le fichier cache, qui
// permet a public/cacher d'invalider le cache si le visiteur suivant n'a
// pas la meme session
function balise_SESSION_dist($p) {
$p->descr['session'] = true;
$f = function_exists('balise_ENV')
? 'balise_ENV'
: 'balise_ENV_dist';
$p = $f($p, '$GLOBALS["auteur_session"]');
return $p;
}
// //
// #EVAL{...} // #EVAL{...}
......
...@@ -99,6 +99,15 @@ function cache_valide(&$page, $date) { ...@@ -99,6 +99,15 @@ function cache_valide(&$page, $date) {
return 1; return 1;
} }
// Si la page a un invalideur de session 'zz', on ignore le cache
// si le visiteur n'a pas la meme session 'zz'
if (isset($page['invalideurs'])
AND isset($page['invalideurs']['session'])
AND $page['invalideurs']['session'] != spip_session()) {
#spip_log('Session: \''.$page['invalideurs']['session'] . '\' != \''.spip_session().'\'');
return 1;
}
// Sinon comparer l'age du fichier a sa duree de cache // Sinon comparer l'age du fichier a sa duree de cache
$duree = intval($page['entetes']['X-Spip-Cache']); $duree = intval($page['entetes']['X-Spip-Cache']);
if ($duree == 0) #CACHE{0} if ($duree == 0) #CACHE{0}
......
...@@ -439,6 +439,12 @@ function applique_filtres($p) { ...@@ -439,6 +439,12 @@ function applique_filtres($p) {
if ($p->param) if ($p->param)
$code = compose_filtres($p, $code); $code = compose_filtres($p, $code);
// S'il y a un lien avec la session, ajouter un code qui levera
// un drapeau dans la structure d'invalidation $Cache
if ($p->descr['session'])
$code = "$code
. (!\$Cache['session']=true) // invalideur session\n ";
// ramasser les images intermediaires inutiles et graver l'image finale // ramasser les images intermediaires inutiles et graver l'image finale
if ($p->ramasser_miettes) if ($p->ramasser_miettes)
$code = "filtrer('image_graver',$code)"; $code = "filtrer('image_graver',$code)";
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter