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