Permettre (via une constante) de passer de 65 536 à 4096 le nombre max de fichiers dans le cache
Bonjour, Concernant le cache de second niveau de SPIP, c’est-à-dire celui qui contient le résultat du calcul des squelettes :
Jusqu’à la branche 3.0 de SPIP la taille maximum du cache était par défaut de 10 Mo.
A partir de la branche 3.1 de SPIP, le nombre maximal de fichier dans le cache est de 65 536 (et il n'y a plus de limite sur la taille du cache). Sur un cas réel, le cache a atteint 2 Go (soit une moyenne de 31 Ko par fichier). Certains hébergeurs ont un quota sur la taille, mais également sur le nombre d’inodes. Dans un cas réel, des sites ont ainsi atteint le quota d’inodes, ce qui empêchait l’accès à l’espace privé des sites (cf. contrib.spip.net/Plugins-Giseh#comment502510).
Remarque : L’expérience montre que le passage d’un robot, qui n’est pas identifié par SPIP, peut suffit à garnir le cache. Or la liste des robots détectés par SPIP ne sera jamais exhaustive. Par ailleurs, pour certains robots (aspirateurs de sites ou autre) il est possible de modifier leur user-agent.
Aussi, je propose que, via l’ajout d’une constante dans le fichier mes_options, il soit possible de fixer le nombre maximal de fichier dans le cache à 4096 (au lieu de 65 536). Cette approche, par constante optionnelle, évite d’impacter les sites qui veulent conserver la limite de 65 536 fichiers.
En pratique, il s’agit d’offrir la possibilité de mettre dans le fichier mes_options la constante suivante :
define('_CACHE_MAX_4096_FILES',true) ;
et de prendre en compte cette constante dans le fichier ecrire/public/cacher.php de la manière suivante :
function ecrire_cache($nom_cache, $valeur) {
// $d = substr($nom_cache, 0, 2);
// $u = substr($nom_cache, 2, 2);
$longueur_d = 2;
if (defined('_CACHE_MAX_4096_FILES') AND _CACHE_MAX_4096_FILES){
$longueur_d = 1;
}
$d = substr($nom_cache, 0, $longueur_d);
$u = substr($nom_cache, $longueur_d, 2);
$rep = _DIR_CACHE;
$rep = sous_repertoire($rep, '', false, true);
$rep = sous_repertoire($rep, $d, false, true);
return ecrire_fichier($rep . $u . ".cache", serialize(array("nom_cache" => $nom_cache, "valeur" => $valeur)));
}
function lire_cache($nom_cache) {
// $d = substr($nom_cache, 0, 2);
// $u = substr($nom_cache, 2, 2);
$longueur_d = 2;
if (defined('_CACHE_MAX_4096_FILES') AND _CACHE_MAX_4096_FILES){
$longueur_d = 1;
}
$d = substr($nom_cache, 0, $longueur_d);
$u = substr($nom_cache, $longueur_d, 2);
if (file_exists($f = _DIR_CACHE . "$d/$u.cache")
and lire_fichier($f, $tmp)
and $tmp = unserialize($tmp)
and $tmp['nom_cache'] == $nom_cache
and isset($tmp['valeur'])
) {
return $tmp['valeur'];
}
return false;
}
Cordialement Equipement