[spip-dev] Accélerer SPIP : Sortir complètement les squelettes de l'espace des globales

Hello,

historiquement les squelettes étaient tous exécutes dans l'espace des globales, ce qui permettait d'adresser en php une variable globale directement :

<?php

if ($auteur_session['id_auteur']) {

...

?>

puis suite à une évolution du code interne de l'évaluation des squelettes, seul le squelette principal (sommaire.html, article.html...) est aujourd'hui encore dans l'espace des globales.
Pour les squelettes inclus on est obligés d'écrire explicitement :

<?php

if ($GLOBALS['auteur_session']['id_auteur']) {

...

?>
Pour le squelette principal, la première écriture reste fonctionnelle.

Je propose de sortir aussi le squelette principal de cet espace des globales.
D'un point de vue des squelettes, cela ramènera un comportement identique qu'on soit dans une inclusion ou non, ce qui est toujours mieux.
Cela créé cependant une incompatibilité partielle si on utilisait des globales adressées implicitement dans un squelette principal : il faudra les expliciter à l'aide de $GLOBALS.

L'avantage de ce changement est d'ouvrir la porte à l'encapsulation du cache de chaque squelette dans une fonction php quand cela est nécessaire.

Cela permettrait de tester le remplacement les eval() utilisés pour évaluer le cache par un simple include_once ce qui aurait pour bénéfice :
- de simplifier le debug PHP éventuel, ou l'execution pas à pas en PHP qui est bloquée quand on rencontre un eval
- d'améliorer potentiellement la rapidité de service du cache, car "include" bénéficie des accélérateurs (comme eAccelerator, APXC, XCache) ce qui n'est pas le cas de eval()

Il me semble que la rupture de compatibilité est faible, l'essentiel ayant déjà été fait, et que SPIP 3.0 est la bonne occasion pour faire cela.
Des avis contraires ?

Cédric

(cf http://core.spip.org/issues/2256
Cette question fait suite à une remarque pertinente remontée par un admin sys)

Oui, cela me semble être une excellent idée en effet.
Pour ma part je n’y vois que des avantages.
La vérification de compatibilité des squelettes est très simple par rapport aux autres contraintes, je ne vois pas pourquoi hésiter sur la suppression d’un eval() potentiellement source de failles de sécu (sur des plugins écrits trop vite, ça devient simple…).

.Gilles

2011/8/29 cedric.morin@yterium.com <cedric.morin@yterium.com>

Hello,

les perspectives sont radieuses mais pour une décision avertie,
pourrait on prendre la mesure de l'emploi des $auteur_session et autres globales
par un grep sur la zone comme davux a fait pour les fonction déprécies en php 5.3 ?

JLuc

Hello,

les perspectives sont radieuses mais pour une décision avertie,
pourrait on prendre la mesure de l'emploi des $auteur_session et autres globales
par un grep sur la zone comme davux a fait pour les fonction déprécies en php 5.3 ?

Voilà ce que ça donne sur le dossier _squelettes_ de la zone sur *la seule* variable $auteur_session
http://spip.pastebin.fr/12315

A noter que :
- tetrispip par exemple a déjà un
global $auteur_session;
ce qui est une autre façon d'être compatible sans rien changer d'autre au code

- il y a déjà des références dans des squelettes d'inclusion ne sont déjà plus fonctionnelles (bloog, eva-web/3_0)
- certains squelettes sont des branches pour des vieilles version de SPIP et donc ne comptent pas.

Cédric

29/08/2011, JLuc:

pourrait on prendre la mesure de l'emploi des $auteur_session et
autres globales par un grep sur la zone comme davux a fait pour les
fonction déprécies en php 5.3 ?

(C'était xdjuj, pas moi.)