Ejemplo n.º 1
0
/**
 * Interface du gestionnaire de cache
 * Si son 3e argument est non vide, elle passe la main a creer_cache
 * Sinon, elle recoit un contexte (ou le construit a partir de REQUEST_URI)
 * et affecte les 4 autres parametres recus par reference:
 * - use_cache qui vaut
 *     -1 s'il faut calculer la page sans la mettre en cache
 *      0 si on peut utiliser un cache existant
 *      1 s'il faut calculer la page et la mettre en cache
 * - chemin_cache qui est le chemin d'acces au fichier ou vide si pas cachable
 * - page qui est le tableau decrivant la page, si le cache la contenait
 * - lastmodified qui vaut la date de derniere modif du fichier.
 * Elle retourne '' si tout va bien
 * un message d'erreur si le calcul de la page est totalement impossible
 *
 * http://code.spip.net/@public_cacher_dist
 *
 * @param array $contexte
 * @param int $use_cache
 * @param string $chemin_cache
 * @param array $page
 * @param int $lastmodified
 * @return string|void
 */
function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified)
{
    # fonction de cache minimale : dire "non on ne met rien en cache"
    # $use_cache = -1; return;
    // Second appel, destine a l'enregistrement du cache sur le disque
    if (isset($chemin_cache)) {
        return creer_cache($page, $chemin_cache);
    }
    // Toute la suite correspond au premier appel
    $contexte_implicite = $page['contexte_implicite'];
    // Cas ignorant le cache car completement dynamique
    if ($_SERVER['REQUEST_METHOD'] == 'POST' or _request('connect')) {
        $use_cache = -1;
        $lastmodified = 0;
        $chemin_cache = "";
        $page = array();
        return;
    }
    // Controler l'existence d'un cache nous correspondant
    $chemin_cache = generer_nom_fichier_cache($contexte, $page);
    $lastmodified = 0;
    // charger le cache s'il existe (et si il a bien le bon hash = anticollision)
    if (!($page = lire_cache($chemin_cache))) {
        $page = array();
    }
    // s'il est sessionne, charger celui correspondant a notre session
    if (isset($page['invalideurs']) and isset($page['invalideurs']['session'])) {
        $chemin_cache_session = generer_nom_fichier_cache(array("chemin_cache" => $chemin_cache), array("session" => spip_session()));
        if ($page_session = lire_cache($chemin_cache_session) and $page_session['lastmodified'] >= $page['lastmodified']) {
            $page = $page_session;
        } else {
            $page = array();
        }
    }
    // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
    if (isset($GLOBALS['meta']['invalider'])) {
        // ne le faire que si la base est disponible
        if (spip_connect()) {
            include_spip('inc/invalideur');
            retire_caches($chemin_cache);
            # API invalideur inutile
            supprimer_fichier(_DIR_CACHE . $chemin_cache);
            if (isset($chemin_cache_session) and $chemin_cache_session) {
                supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
            }
        }
    }
    // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
    // on supprime le cache
    if (defined('_VAR_MODE') && _VAR_MODE && (isset($_COOKIE['spip_session']) || isset($_COOKIE['spip_admin']) || @file_exists(_ACCESS_FILE_NAME))) {
        $page = array('contexte_implicite' => $contexte_implicite);
        // ignorer le cache deja lu
        include_spip('inc/invalideur');
        retire_caches($chemin_cache);
        # API invalideur inutile
        supprimer_fichier(_DIR_CACHE . $chemin_cache);
        if (isset($chemin_cache_session) and $chemin_cache_session) {
            supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
        }
    }
    // $delais par defaut
    // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
    // qui sont a cache nul par defaut
    if (!isset($GLOBALS['delais'])) {
        if (!defined('_DUREE_CACHE_DEFAUT')) {
            define('_DUREE_CACHE_DEFAUT', 24 * 3600);
        }
        $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
    }
    // determiner la validite de la page
    if ($page) {
        $use_cache = cache_valide($page, isset($page['lastmodified']) ? $page['lastmodified'] : 0);
        // 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('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 (isset($page['texte'])) {
            gunzip_page($page);
            $use_cache = 0;
        } else {
            spip_log("Erreur base de donnees, impossible utiliser {$chemin_cache}");
            include_spip('inc/minipres');
            return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), array('status' => 503));
        }
    }
    if ($use_cache < 0) {
        $chemin_cache = '';
    }
    return;
}
Ejemplo n.º 2
0
function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) {

	// Second appel, destine a l'enregistrement du cache sur le disque
	if (isset($chemin_cache)) return creer_cache($page, $chemin_cache);

	// Toute la suite correspond au premier appel
	$contexte_implicite = $page['contexte_implicite'];

	// Cas ignorant le cache car completement dynamique
	if ($_SERVER['REQUEST_METHOD'] == 'POST'
	OR (substr($contexte_implicite['cache'],0,8)=='modeles/') 
	OR (_request('connect'))
// Mode auteur authentifie appelant de ecrire/ : il ne faut rien lire du cache
// et n'y ecrire que la compilation des squelettes (pas les pages produites)
// car les references aux repertoires ne sont pas relatifs a l'espace public
	OR test_espace_prive()) {
		$use_cache = -1;
		$lastmodified = 0;
		$chemin_cache = "";
		$page = array();
		return;
	}

	// Controler l'existence d'un cache nous correspondant
	$chemin_cache = generer_nom_fichier_cache($contexte, $page);
	$lastmodified = 0;

	// charger le cache s'il existe
	if (lire_fichier(_DIR_CACHE . $chemin_cache, $page))
		$page = @unserialize($page);
	else
		$page = array();

	// s'il est sessionne, charger celui correspondant a notre session
	if (isset($page['invalideurs'])
	AND isset($page['invalideurs']['session'])) {
		$chemin_cache_session = $chemin_cache . '_' . spip_session();
		if (lire_fichier(_DIR_CACHE . $chemin_cache_session, $page_session)
		AND $page_session = @unserialize($page_session)
		AND $page_session['lastmodified'] >= $page['lastmodified'])
			$page = $page_session;
		else
			$page = array();
	}

	// HEAD : cas sans jamais de calcul pour raisons de performance
	if ($_SERVER['REQUEST_METHOD'] == 'HEAD') {
		$use_cache = 0;
		$page = array('contexte_implicite'=>$contexte_implicite);
		return;
	}

	// Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
	// on supprime le cache
	if ($GLOBALS['var_mode'] &&
		(isset($_COOKIE['spip_session'])
		|| isset($_COOKIE['spip_admin'])
		|| @file_exists(_ACCESS_FILE_NAME))
	) {
		$page = array('contexte_implicite'=>$contexte_implicite); // ignorer le cache deja lu
		include_spip('inc/invalideur');
		retire_caches($chemin_cache); # API invalideur inutile
		supprimer_fichier(_DIR_CACHE.$chemin_cache);
		if ($chemin_cache_session)
			supprimer_fichier(_DIR_CACHE.$chemin_cache_session);
	}

	// $delais par defaut (pour toutes les pages sans #CACHE{})
	if (!isset($GLOBALS['delais'])) {
		define('_DUREE_CACHE_DEFAUT', 24*3600);
		$GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
	}

	// determiner la validite de la page
	if ($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('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 (isset($page['texte'])) {
			gunzip_page($page);
			$use_cache = 0;
		}
		else {
			spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
			include_spip('inc/minipres');
			return minipres(_T('info_travaux_titre'),  _T('titre_probleme_technique'));
		}
	}

	if ($use_cache < 0) $chemin_cache = '';
	return;
}