/** * 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; }
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; }