Browse Source

fix : l'autoclean doit aussi s'appliquer aux caches qui n'apcu_existent plus. Up Z.

master
JLuc 2 months ago
parent
commit
d5055c4190
  1. 5
      cachetest.html
  2. 27
      inc/cachelab.php
  3. 2
      paquet.xml

5
cachetest.html

@ -8,7 +8,10 @@
<body>
[(#UNIT|non)
<p>On peut tester logé administrateur sur un navigateur, et non identifié sur un autre navigateur : ça permet de comparer les résultats. Pour tester non identifié, il faut mettre un define('CACHELAB_DATE_TESTS','2018-12-12') à la date du jour de test ou à 'TOUJOURS' dans votre fichier d'options</p>
<p>On peut tester logé administrateur sur un navigateur, et non identifié sur un autre navigateur :
ça permet de comparer les résultats. <br>
Pour tester non identifié, il faut mettre un define('CACHELAB_DATE_TESTS','2018-12-12') à la date du jour de test ou à 'TOUJOURS'
dans votre fichier d'options</p>
<p>Dans le menu de chaque test, «<code>recalcul et assert</code>» active les assertions, et «<code>recalcul et var_cache</code>» active la visualisation des infos de sessionnement des caches</p>
<p>Dans les noisette testée*, il y a une assertion sur le sessionnement qui affiche une erreur si le sessionnement n'est pas comme attendu <small>(* Certaines des inclusions de cachetests/inclure ne le sont pas.)</small> Dans le "test des tests", 2 erreurs sont commises intentionnellement : elles permettent de tester les assertions. La version buguée de SPIP n'en détecte qu'une seule.</p>
<p>Avec Memoization par APC ou APCu, XRay permet visualiser les contenus des caches et leurs métadonnées. On trouve les caches concernés en cherchant 'cachetests/'. La sélection "Caches sessionnés" et l'option d'affichage "Squelettes" (<a href="#URL_ECRIRE{xray,OB=2&S_KEY=H&TYPELISTE=squelettes&COUNT=20&TYPECACHE=SESSIONS}">Liste XRay des caches sessionnés</a>) donne la liste des squelettes sessionnés. Aprés être passé sur tous les tests sans recalculer (sinon ça vide les caches !), ces listes sont les suivantes :

27
inc/cachelab.php

@ -89,10 +89,10 @@ static $len_prefix;
* @param array $conditions
* @return array ($session, $chemin, $chemins, $cle_objet, $id_objet, $plusfunc)
*/
function cachelab_prepare_conditions(array $conditions) {
function cachelab_prepare_conditions(array $conditions): ?array {
// filtrage
$session = ($conditions['session'] ?? null);
if ($session=='courante') {
if ($session==='courante') {
$session = spip_session();
}
@ -153,9 +153,9 @@ function cachelab_prepare_conditions(array $conditions) {
* avec éventuellement la liste des résultats, pour action 'list' ou 'list_html' ou option 'list'
*
*/
function cachelab_cibler(string $action, array $conditions = array(), array $options = array()) {
function cachelab_cibler(string $action, array $conditions = array(), array $options = []) {
$Memoization = memoization();
if (!isset($Memoization) or !$Memoization or !in_array($Memoization->methode(), array('apc', 'apcu'))) {
if (!isset($Memoization) or !in_array($Memoization->methode(), array('apc', 'apcu'))) {
spip_log("cachelab_cibler($action...) : Mémoization n'est pas activé avec APC ou APCu", 'ERREUR_cachelab');
die("cachelab_cibler($action...) : le plugin Mémoization doit être activé avec APC ou APCu");
}
@ -186,6 +186,9 @@ function cachelab_cibler(string $action, array $conditions = array(), array $opt
$partie_chemin = ($options['partie_chemin'] ?? 'tout');
// clean par défaut
$do_clean = ($options['clean'] ?? (!defined('CACHELAB_CLEAN') or CACHELAB_CLEAN));
if (!$do_clean) {
spip_log("cachelab_cibler($action...) : on ne nettoye pas", 'ATTENTION_cachelab'._LOG_ERREUR);
}
// pas de listes par défaut
$do_lists = ($action == 'list') or (isset($options['list']) and $options['list']);
include_spip('lib/microtime.inc');
@ -220,7 +223,7 @@ function cachelab_cibler(string $action, array $conditions = array(), array $opt
// effacer ou sauter les caches invalidés par une invalidation totale
// ou que apcu ne suit plus
if (
(!($a_exists = apcu_exists($cle))) // cache apcu disparu
(!apcu_exists($cle)) // cache apcu disparu
or ($meta_derniere_modif > $d['creation_time']) // invalidation spip
or ($d['creation_time'] + $d['ttl'] <= $time) // cache APCU périmé
) {
@ -228,23 +231,15 @@ function cachelab_cibler(string $action, array $conditions = array(), array $opt
$memoiz_cle = substr($cle, $len_prefix);
$ok_del = false;
// Avant ce test il arrivait parfois des salves de 10 à 50 logs d'échec du clean cache simultanés (mm t, mm pid)
if ($m_exists = $Memoization->exists($memoiz_cle)) {
if ($Memoization->exists($memoiz_cle)) {
$ok_del = $Memoization->del ($memoiz_cle);
}
$trace = "\ncle=>$cle, \napcu_exists=>$a_exists, \nm_exists=>$m_exists,"
."\nmeta_derniere_modif=>$meta_derniere_modif, \ncreation=>{$d['creation_time']}, \nttl=>{$d['ttl']}, \nnow=>".time();
if ($a_exists and !$ok_del) {
$ok_del = apcu_delete($cle); // bourrin et souvent inutile d'après les logs. Log / est-ce parfois utile ?
if ($ok_del) {
spip_log("apcu_delete bourrin requis et réussi. $trace", 'cachelab_bourrin_UTILE');
}
if (!$ok_del) {
$ok_del = apcu_delete($cle); // utile car les caches périmés sont encore là mais apcu_exists renvoie false
}
if ($ok_del) {
$stats['nb_clean']++;
}
else {
spip_log("clean impossible pour $trace", 'ERREUR_cachelab');
}
}
continue;
}

2
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="cachelab"
categorie="performance"
version="1.3.0"
version="1.3.1"
etat="test"
compatibilite="[4.0.0;4.0.*]"
logo="prive/themes/spip/images/cachelab-32.png"

Loading…
Cancel
Save