Valider f80377d5 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

desembrouillage des notes, suite (et fin ?)

En synthese, 2 points importants :
- on assure ainsi la coherence des notes quelle que soit la configuration des inclusion, de leur cache et la configuration de calcul
- il serait possible de faire remonter les notes d'un <modele> ou d'un #INCLURE vers l'appelant lorsqu'elle ne sont pas affichee dans l'appele, en assurant la coherence que l'appele sorte du cache ou non. C'etait pour le moment impossible et donc non retenu. 

En detail :
- le statut des notes doit etre stocke dans le cache pour permettre sa restauration meme si la page n'est pas calculee. Pour ce faire, on modifie la signature de inc_notes_dist dont l'unique argument etait deja use jusqu'a la corde en introduisant un second argument 'operation' qui par defaut vaut 'traiter'.
Les autres valeurs possibles dont 'empiler', 'depiler', 'sauver_etat', 'restaurer_etat' et 'contextet_cache'

Ce statut en cache peut donc etre restaure avant evaluation d'une page tiree du cache afin que les <inclure> contenus recupererent le meme etat que lors d'un calcul global.
Cela fait apparaitre le statut des notes comme un element du contexte implicite du cache, au meme titre que $marqueur,$squelettes ...

Plutot qu'ajouter une autre verrue dans public_cacher_dist, on fait remonter le contexte_implicite au niveau d'assembler, ou il est renseigne dans les deux points d'entreee public_assembler_dist et inclure_page via la fonction calculer_contexte_implicite(). Il est passe en argument 'contexte_implicite' de $page, qui sera pris en compte dans le calcul du nom du cache et preserve au retour de l'appel a public_cacher().
Le contexte_implicite n'est pas sauvegarde dans le cache car un nom d'un cache ne peut correspondre qu'a un contexte_implicite. Il est donc reinjecte dans $page apres sa relecture depuis le cache.

Compte tenu de la stabilisation de la branche, on evite de propager le contexte_implicite au dela, mais dans le futur il serait bien de le faire remonter la chaine inclure_page, evaluer_fond, recuperer_fond pour permettre de le renseigner en amont dans l'appel a recuperer_fond ecrit dans le cache
parent c07590e7
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -33,7 +33,7 @@ function action_purger_dist()
		@spip_unlink(_CACHE_PLUGINS_FCT);
		@spip_unlink(_CACHE_PLUGINS_VERIF);
		@spip_unlink(_CACHE_CHEMIN);
		purger_repertoire(_DIR_CACHE);
		purger_repertoire(_DIR_CACHE,array('subdir'=>true));
		purger_repertoire(_DIR_AIDE);
		purger_repertoire(_DIR_VAR.'cache-css');
		purger_repertoire(_DIR_VAR.'cache-js');
+53 −31
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -24,15 +24,19 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// en particulier, envoyer un tableau vide permet de tout recuperer
// C'est stocke dans la globale $les_notes, mais pas besoin de le savoir

function inc_notes_dist($arg)
function inc_notes_dist($arg,$operation='traiter')
{
	static $pile = array();
	static $next_marqueur = 1;
	static $marqueur = 1;
	global $les_notes, $compt_note, $notes_vues;
	if (is_string($arg)) return traiter_raccourci_notes($arg, $marqueur>1?$marqueur:'');
	elseif (is_array($arg)) return traiter_les_notes($arg);
	elseif ($arg === true) {
	switch ($operation){
		case 'traiter':
			if (is_array($arg)) return traiter_les_notes($arg);
			else
				return traiter_raccourci_notes($arg, $marqueur>1?$marqueur:'');
			break;
		case 'empiler':
			#var_dump(">$compt_note:$marqueur");
			if ($compt_note==0)
				// si le marqueur n'a pas encore ete utilise, on le recycle dans la pile courante
@@ -45,7 +49,8 @@ function inc_notes_dist($arg)
			}
			$les_notes = '';
			$compt_note = 0;
	} elseif ($arg === false) {
			break;
		case 'depiler':
			#$prev_notes = $les_notes;
			if (strlen($les_notes)) spip_log("notes perdues");
			// si le marqueur n'a pas servi, le liberer
@@ -60,6 +65,23 @@ function inc_notes_dist($arg)
				$next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general
				$marqueur = $next_marqueur; // et on le prend comme marqueur courant
			}
			break;
		case 'sauver_etat':
			if ($compt_note OR $marqueur>1 OR $next_marqueur>1)
				return array($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur);
			else
				return ''; // rien a sauver
			break;
		case 'restaurer_etat':
			if ($arg AND is_array($arg)) // si qqchose a restaurer
				list($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur) = $arg;
			break;
		case 'contexter_cache':
			if ($compt_note OR $marqueur>1 OR $next_marqueur>1)
				return array("$compt_note:$marqueur:$next_marqueur");
			else
				return '';
			break;
	}
}

+6 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -186,6 +186,12 @@ if (isset($GLOBALS['_INC_PUBLIC'])) {
	else {
		// sinon, inclure_balise_dynamique nous enverra peut-etre
		// quelques en-tetes de plus (voire qq envoyes directement)

		// restaurer l'etat des notes
		if (isset($page['notes']) AND $page['notes']){
			$notes = charger_fonction("notes","inc");
			$notes($page['notes'],'restaurer_etat');
		}
		ob_start(); 
		xml_hack($page, true);
		$res = eval('?' . '>' . $page['texte']);
+33 −6
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -25,11 +25,8 @@ function assembler($fond, $connect='') {
	global $flag_preserver,$lastmodified, $use_cache, $contexte;

	$contexte = calculer_contexte();

	$page = $fond .
		preg_replace(',\.[a-zA-Z0-9]*$,', '', 
		preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']));

	$page = array('contexte_implicite'=>calculer_contexte_implicite());
	$page['contexte_implicite']['cache'] = $fond . preg_replace(',\.[a-zA-Z0-9]*$,', '', preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']));
	// Cette fonction est utilisee deux fois
	$cacher = charger_fonction('cacher', 'public');
	// Les quatre derniers parametres sont modifies par la fonction:
@@ -201,6 +198,26 @@ function calculer_contexte() {
	return $contexte;
}

/**
 * Calculer le contexte implicite, qui n'apparait pas dans le ENV d'un cache
 * mais est utilise pour distinguer deux caches differents
 *
 * @staticvar string $notes
 * @return array
 */
function calculer_contexte_implicite(){
	static $notes = null;
	if (is_null($notes))
		$notes = charger_fonction('notes','inc');
	$contexte_implicite = array(
		'squelettes' => $GLOBALS['dossier_squelettes'],
		'host' => $_SERVER['HTTP_HOST'],
		'marqueur' => (isset($GLOBALS['marqueur']) ?  $GLOBALS['marqueur'] : ''),
		'notes' => $notes('','contexter_cache'),
	);
	return $contexte_implicite;
}

//
// fonction pour compatibilite arriere, probablement superflue
//
@@ -224,15 +241,18 @@ function inclure_page($fond, $contexte, $connect='') {
	// dans les sous inclusions -> boucle infinie d'inclusion identique
	// (cette precaution n'est probablement plus utile)
	unset($contexte['fond']);
	$page = $fond; 
	$page = array('contexte_implicite'=>calculer_contexte_implicite());
	$page['contexte_implicite']['cache'] = $fond;
	$cacher = charger_fonction('cacher', 'public');
	// Les quatre derniers parametres sont modifies par la fonction:
	// emplacement, validite, et, s'il est valide, contenu & age
	$res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
	// $res = message d'erreur : on sort de la
	if ($res) {return array('texte' => $res);}

	// Si use_cache ne vaut pas 0, la page doit etre calculee
	// produire la page : peut mettre a jour $lastinclude
	// le contexte_cache envoye a cacher() a ete conserve et est passe a produire
	if ($use_cache) {
		$produire_page = charger_fonction('produire_page','public');
		$page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
@@ -258,6 +278,7 @@ function inclure_page($fond, $contexte, $connect='') {
 * @return array
 */
function public_produire_page_dist($fond, $contexte, $use_cache, $chemin_cache, $contexte_cache, &$page, &$lastinclude, $connect=''){
	#var_dump($page);
	$parametrer = charger_fonction('parametrer', 'public');
	$page = $parametrer($fond, $contexte, $chemin_cache, $connect);
	// et on l'enregistre sur le disque
@@ -569,6 +590,12 @@ function evaluer_fond ($fond, $contexte=array(), $connect=null) {
	if (!$page) return $page;

	if ($page['process_ins'] != 'html') {
		// restaurer l'etat des notes
		if (isset($page['notes']) AND $page['notes']){
			$notes = charger_fonction("notes","inc");
			$notes($page['notes'],'restaurer_etat');
		}

		ob_start();
		xml_hack($page, true);
		eval('?' . '>' . $page['texte']);
+13 −10
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -20,7 +20,8 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@generer_nom_fichier_cache
function generer_nom_fichier_cache($contexte, $page) {

	$cache = $page . '-';
	$cache = $page['contexte_implicite']['cache'] . '-';

	foreach ($contexte as $var=>$val) {
		$val = is_array($val) ? var_export($val,true) : strval($val);
		$cache .= str_replace('-', '_', $val) . '-' ;
@@ -38,11 +39,9 @@ function generer_nom_fichier_cache($contexte, $page) {
	// donc, par exemple, de gerer differents dossiers de squelettes
	// en parallele, ou de la "personnalisation" via un marqueur (dont la
	// composition est totalement libre...)
	$md_cache = md5($page . ' '
	$md_cache = md5(
		var_export($page['contexte_implicite'],true) . ' '
		. var_export($contexte,true)
		. $_SERVER['HTTP_HOST'] . ' '
		. $GLOBALS['dossier_squelettes'] . ' '
		. (isset($GLOBALS['marqueur']) ?  $GLOBALS['marqueur'] : '')
	);

	$cache .= '-'.substr($md_cache, 1, 32-strlen($cache));
@@ -97,7 +96,7 @@ function cache_valide(&$page, $date) {

	if (isset($GLOBALS['var_nocache']) AND $GLOBALS['var_nocache']) return -1;
	if (defined('_NO_CACHE')) return (_NO_CACHE==0 AND !$page)?1:_NO_CACHE;
	if (!$page) return 1;
	if (!$page OR !isset($page['entetes']['X-Spip-Cache'])) return 1;

	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
	// cf. ecrire/public/balises.php, balise_CACHE_dist()
@@ -240,6 +239,7 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
	// Controler l'existence d'un cache nous correspondant, dans les
	// deux versions possibles : session ou non
	$chemin_cache = generer_nom_fichier_cache($contexte, $page);
	$contexte_implicite = $page['contexte_implicite'];
	$lastmodified = 0;
	if (!lire_fichier(_DIR_CACHE . ($f = $chemin_cache), $page))
		$fs = lire_fichier(_DIR_CACHE . ($f = cache_sessionne($f, spip_session())), $page);
@@ -247,7 +247,7 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
	// HEAD : cas sans jamais de calcul pour raisons de performance
	if ($_SERVER['REQUEST_METHOD'] == 'HEAD') {
		$use_cache = 0;
		$page = array();
		$page = array('contexte_implicite'=>$contexte_implicite);
		return;
	}

@@ -267,7 +267,7 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
		|| isset($_COOKIE['spip_admin'])
		|| @file_exists(_ACCESS_FILE_NAME))
	) {
		$page = array(); // ignorer le cache deja lu
		$page = array('contexte_implicite'=>$contexte_implicite); // ignorer le cache deja lu
		supprimer_fichier(_DIR_CACHE . $f); // pas necessaire ?
		if (in_array($GLOBALS['var_mode'], array('calcul', 'recalcul'))
		AND $fs) {
@@ -286,19 +286,22 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
	if ($page AND
		$page = @unserialize($page)) {
		$use_cache = cache_valide($page, $page['lastmodified']);
		// le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
		// par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
		$page['contexte_implicite'] = $contexte_implicite;
		if (!$use_cache) {
			// $page est un cache utilisable
			gunzip_page($page);
			return;
		}
	} else {
		$page = array();
		$page = array('contexte_implicite'=>$contexte_implicite);
		$use_cache = cache_valide($page,0); // fichier cache absent : provoque le calcul
	}

	// Si pas valide mais pas de connexion a la base, le garder quand meme
	if (!spip_connect()) {
		if ($page)
		if (isset($page['texte']))
			$use_cache = 0;
		else {
			spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
Chargement en cours