From 2499f63f7c3fc40323b5d0910a397f55e1e827ce Mon Sep 17 00:00:00 2001 From: Matthieu Marcillaud <marcimat@rezo.net> Date: Sat, 29 Jul 2023 10:59:47 +0200 Subject: [PATCH] =?UTF-8?q?refactor:=20Rennomer=20chemin=5Fcache=20en=20ca?= =?UTF-8?q?che=5Fkey=20(ce=20n=E2=80=99est=20pas=20/=20plus=20un=20chemin)?= =?UTF-8?q?=20+=20qq=20typages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecrire/public/assembler.php | 30 ++--- ecrire/public/cacher.php | 121 ++++++++---------- .../data/squelettes/inc/maj_invalideurs.php | 4 +- 3 files changed, 71 insertions(+), 84 deletions(-) diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php index 8959591244..dfcd68da0c 100644 --- a/ecrire/public/assembler.php +++ b/ecrire/public/assembler.php @@ -24,7 +24,7 @@ if (!defined('_ECRIRE_INC_VERSION')) { function assembler($fond, string $connect = '') { - $chemin_cache = null; + $cache_key = null; $lastmodified = null; $res = null; // flag_preserver est modifie ici, et utilise en globale @@ -43,7 +43,7 @@ function assembler($fond, string $connect = '') { // Les quatre derniers parametres sont modifies par la fonction: // emplacement, validite, et, s'il est valide, contenu & age if ($cacher) { - $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified); + $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $cache_key, $page, $lastmodified); } else { $GLOBALS['use_cache'] = -1; } @@ -52,7 +52,7 @@ function assembler($fond, string $connect = '') { return ['texte' => $res]; } - if (!$chemin_cache || !$lastmodified) { + if (!$cache_key || !$lastmodified) { $lastmodified = time(); } @@ -65,7 +65,7 @@ function assembler($fond, string $connect = '') { if ( isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && (!defined('_VAR_MODE') || !_VAR_MODE) - && $chemin_cache && isset($page['entetes']) + && $cache_key && isset($page['entetes']) && isset($page['entetes']['Cache-Control']) && strstr($page['entetes']['Cache-Control'], 'max-age=') && !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/') @@ -124,7 +124,7 @@ function assembler($fond, string $connect = '') { $fond, $GLOBALS['contexte'], $GLOBALS['use_cache'], - $chemin_cache, + $cache_key, null, $page, $lastmodified, @@ -141,8 +141,8 @@ function assembler($fond, string $connect = '') { } } - if ($page && $chemin_cache) { - $page['cache'] = $chemin_cache; + if ($page && $cache_key) { + $page['cache'] = $cache_key; } auto_content_type($page); @@ -269,7 +269,7 @@ function auto_content_type($page) { function inclure_page($fond, $contexte, string $connect = '') { $use_cache = null; - $chemin_cache = null; + $cache_key = null; $lastinclude = null; $res = null; static $cacher, $produire_page; @@ -286,7 +286,7 @@ function inclure_page($fond, $contexte, string $connect = '') { // Les quatre derniers parametres sont modifies par la fonction: // emplacement, validite, et, s'il est valide, contenu & age if ($cacher) { - $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude); + $res = $cacher($contexte, $use_cache, $cache_key, $page, $lastinclude); } else { $use_cache = -1; } @@ -303,7 +303,7 @@ function inclure_page($fond, $contexte, string $connect = '') { if (is_null($produire_page)) { $produire_page = charger_fonction('produire_page', 'public'); } - $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect); + $page = $produire_page($fond, $contexte, $use_cache, $cache_key, $contexte, $page, $lastinclude, $connect); } // dans tous les cas, mettre a jour $GLOBALS['lastmodified'] $GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude); @@ -318,7 +318,7 @@ function inclure_page($fond, $contexte, string $connect = '') { * @param string $fond * @param array $contexte * @param int $use_cache - * @param string $chemin_cache + * @param string $cache_key * @param array $contexte_cache * @param array $page * @param int $lastinclude @@ -329,7 +329,7 @@ function public_produire_page_dist( $fond, $contexte, $use_cache, - $chemin_cache, + $cache_key, $contexte_cache, &$page, &$lastinclude, @@ -339,10 +339,10 @@ function public_produire_page_dist( if (!$parametrer) { $parametrer = charger_fonction('parametrer', 'public'); } - $page = $parametrer($fond, $contexte, $chemin_cache, $connect); + $page = $parametrer($fond, $contexte, $cache_key, $connect); // et on l'enregistre sur le disque if ( - $chemin_cache + $cache_key && $use_cache > -1 && is_array($page) && count($page) @@ -354,7 +354,7 @@ function public_produire_page_dist( } $lastinclude = time(); if ($cacher) { - $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude); + $cacher($contexte_cache, $use_cache, $cache_key, $page, $lastinclude); } else { $use_cache = -1; } diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php index 068f945a50..0abd41d39f 100644 --- a/ecrire/public/cacher.php +++ b/ecrire/public/cacher.php @@ -28,38 +28,28 @@ function cache_instance(): CacheInterface { } /** - * Retourne un nom (identifiant) pour le cache - * - * @param array $contexte - * @param array $page - * @return string + * Returns a key cache (id) for this data */ -function generer_nom_fichier_cache($contexte, $page): string { +function cache_key(array $contexte, array $page): string { static $hasher = null; $hasher ??= new Hash32(); return $hasher->hash([$contexte, $page]) . '.cache'; } - /** - * ecrire le cache dans un casier - * - * @param string $nom_cache - * @param array $valeur - * @return bool + * Écrire le cache dans un casier */ -function ecrire_cache($nom_cache, $valeur): bool { - return cache_instance()->set($nom_cache, ['nom_cache' => $nom_cache, 'valeur' => $valeur]); +function ecrire_cache(string $cache_key, array $valeur): bool { + return cache_instance()->set($cache_key, ['cache_key' => $cache_key, 'valeur' => $valeur]); } /** * lire le cache depuis un casier * - * @param string $nom_cache * @return null|mixed null: probably cache miss */ -function lire_cache($nom_cache): mixed { - return cache_instance()->get($nom_cache); +function lire_cache(string $cache_key): mixed { + return cache_instance()->get($cache_key); } /** @@ -67,7 +57,7 @@ function lire_cache($nom_cache): mixed { * * Parano : on signe le cache, afin d'interdire un hack d'injection dans notre memcache */ -function cache_signature(&$page) { +function cache_signature(&$page): string { if (!isset($GLOBALS['meta']['cache_signature'])) { include_spip('inc/acces'); ecrire_meta( @@ -81,15 +71,14 @@ function cache_signature(&$page) { } /** - * Faut-il compresser ce cache ? A partir de 16ko ca vaut le coup + * Faut-il compresser ce cache ? + * + * A partir de 16ko ca vaut le coup * (pas de passage par reference car on veut conserver la version non compressee * pour l'afficher) * on positionne un flag gz si on comprime, pour savoir si on doit decompresser ou pas - * - * @param array $page - * @return array */ -function gzip_page($page) { +function gzip_page(array $page): array { if (function_exists('gzcompress') && strlen((string) $page['texte']) > 16 * 1024) { $page['gz'] = true; $page['texte'] = gzcompress((string) $page['texte']); @@ -102,14 +91,12 @@ function gzip_page($page) { /** * Faut-il decompresser ce cache ? + * * (passage par reference pour alleger) * on met a jour le flag gz quand on decompresse, pour ne pas risquer * de decompresser deux fois de suite un cache (ce qui echoue) - * - * @param array $page - * @return void */ -function gunzip_page(&$page) { +function gunzip_page(array &$page): void { if ($page['gz']) { $page['texte'] = gzuncompress($page['texte']); $page['gz'] = false; // ne pas gzuncompress deux fois une meme page @@ -117,17 +104,16 @@ function gunzip_page(&$page) { } /** - * gestion des delais d'expiration du cache... + * Gestion des delais d'expiration du cache... + * * $page passee par reference pour accelerer * - * @param array $page - * @param int $date * @return int - * 1 si il faut mettre le cache a jour - * 0 si le cache est valide - * -1 si il faut calculer sans stocker en cache + * - 1 si il faut mettre le cache a jour + * - 0 si le cache est valide + * - -1 si il faut calculer sans stocker en cache */ -function cache_valide(&$page, $date) { +function cache_valide(array &$page, int $date): int { $now = $_SERVER['REQUEST_TIME']; // Apparition d'un nouvel article post-date ? @@ -198,13 +184,14 @@ function cache_valide(&$page, $date) { /** * Creer le fichier cache + * * Passage par reference de $page par souci d'economie * * @param array $page - * @param string $chemin_cache + * @param string $cache_key * @return void */ -function creer_cache(&$page, &$chemin_cache) { +function creer_cache(&$page, &$cache_key) { // Ne rien faire si on est en preview, debug, ou si une erreur // grave s'est presentee (compilation du squelette, MySQL, etc) @@ -217,8 +204,7 @@ function creer_cache(&$page, &$chemin_cache) { return; } - // Si la page c1234 a un invalideur de session 'zz', sauver dans - // 'tmp/cache/MD5(chemin_cache)_zz' + // Si la page a un invalideur de session, utiliser un cache_key spécifique if ( isset($page['invalideurs']) && isset($page['invalideurs']['session']) @@ -226,16 +212,16 @@ function creer_cache(&$page, &$chemin_cache) { // on verifie que le contenu du chemin cache indique seulement // "cache sessionne" ; sa date indique la date de validite // des caches sessionnes - if (!$tmp = lire_cache($chemin_cache)) { - spip_log('Creation cache sessionne ' . $chemin_cache); + if (!$tmp = lire_cache($cache_key)) { + spip_log('Creation cache sessionne ' . $cache_key); $tmp = [ 'invalideurs' => ['session' => ''], 'lastmodified' => $_SERVER['REQUEST_TIME'] ]; - ecrire_cache($chemin_cache, $tmp); + ecrire_cache($cache_key, $tmp); } - $chemin_cache = generer_nom_fichier_cache( - ['chemin_cache' => $chemin_cache], + $cache_key = cache_key( + ['cache_key' => $cache_key], ['session' => $page['invalideurs']['session']] ); } @@ -251,14 +237,14 @@ function creer_cache(&$page, &$chemin_cache) { $pagez['sig'] = cache_signature($pagez); // l'enregistrer, compresse ou non... - $ok = ecrire_cache($chemin_cache, $pagez); + $ok = ecrire_cache($cache_key, $pagez); - spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour " + spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour " . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO); // Inserer ses invalideurs include_spip('inc/invalideur'); - maj_invalideurs($chemin_cache, $page); + maj_invalideurs($cache_key, $page); } @@ -285,6 +271,7 @@ function nettoyer_petit_cache($prefix, $duree = 300) { /** * 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: @@ -292,7 +279,7 @@ function nettoyer_petit_cache($prefix, $duree = 300) { * -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 + * - cache_key est un identifiant pour ce cache, 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 @@ -300,19 +287,19 @@ function nettoyer_petit_cache($prefix, $duree = 300) { * * @param array $contexte * @param int $use_cache - * @param string $chemin_cache + * @param string $cache_key * @param array $page * @param int $lastmodified * @return string|void */ -function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) { +function public_cacher_dist($contexte, &$use_cache, &$cache_key, &$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)) { - creer_cache($page, $chemin_cache); + if (isset($cache_key)) { + creer_cache($page, $cache_key); return; } @@ -326,18 +313,18 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la ) { $use_cache = -1; $lastmodified = 0; - $chemin_cache = ''; + $cache_key = ''; $page = []; return; } // Controler l'existence d'un cache nous correspondant - $chemin_cache = generer_nom_fichier_cache($contexte, $page); + $cache_key = cache_key($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)) { + if (!$page = lire_cache($cache_key)) { $page = []; } @@ -346,12 +333,12 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la isset($page['invalideurs']) && isset($page['invalideurs']['session']) ) { - $chemin_cache_session = generer_nom_fichier_cache( - ['chemin_cache' => $chemin_cache], + $cache_key_session = cache_key( + ['cache_key' => $cache_key], ['session' => spip_session()] ); if ( - ($page_session = lire_cache($chemin_cache_session)) && $page_session['lastmodified'] >= $page['lastmodified'] + ($page_session = lire_cache($cache_key_session)) && $page_session['lastmodified'] >= $page['lastmodified'] ) { $page = $page_session; } else { @@ -364,11 +351,11 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la // ne le faire que si la base est disponible if (isset($GLOBALS['meta']['invalider']) && spip_connect()) { include_spip('inc/invalideur'); - retire_caches($chemin_cache); + retire_caches($cache_key); # API invalideur inutile - cache_instance()->delete($chemin_cache); - if (isset($chemin_cache_session) && $chemin_cache_session) { - supprimer_fichier(_DIR_CACHE . $chemin_cache_session); + cache_instance()->delete($cache_key); + if (isset($cache_key_session) && $cache_key_session) { + supprimer_fichier(_DIR_CACHE . $cache_key_session); } } @@ -383,10 +370,10 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la ) { $page = ['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) && $chemin_cache_session) { - supprimer_fichier(_DIR_CACHE . $chemin_cache_session); + retire_caches($cache_key); # API invalideur inutile + supprimer_fichier(_DIR_CACHE . $cache_key); + if (isset($cache_key_session) && $cache_key_session) { + supprimer_fichier(_DIR_CACHE . $cache_key_session); } } @@ -423,7 +410,7 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la gunzip_page($page); $use_cache = 0; } else { - spip_log("Erreur base de donnees, impossible utiliser $chemin_cache"); + spip_log("Erreur base de donnees, impossible utiliser $cache_key"); include_spip('inc/minipres'); return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]); @@ -431,7 +418,7 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la } if ($use_cache < 0) { - $chemin_cache = ''; + $cache_key = ''; } return; diff --git a/ecrire/tests/Squelettes/Cache/data/squelettes/inc/maj_invalideurs.php b/ecrire/tests/Squelettes/Cache/data/squelettes/inc/maj_invalideurs.php index 4ce844f954..c35c95016d 100644 --- a/ecrire/tests/Squelettes/Cache/data/squelettes/inc/maj_invalideurs.php +++ b/ecrire/tests/Squelettes/Cache/data/squelettes/inc/maj_invalideurs.php @@ -5,10 +5,10 @@ use Spip\Test\Squelettes\Balise\CacheSessionTest; /** * Fonction chargée de faire les assertions d'erreur si l'invalideur session n'est pas comme on l'attend * - * @param string $chemin_cache + * @param string $cache_key * @param array $page */ - function inc_maj_invalideurs($chemin_cache, $page): void { + function inc_maj_invalideurs($cache_key, $page): void { if (!isset($page['contexte']['assert_session'])) { return; } -- GitLab