Skip to content
Extraits de code Groupes Projets
Valider 96062fa2 rédigé par Fil's avatar Fil
Parcourir les fichiers

eviter de planter le site quand il y a trop de fichiers caches à invalider

(c'est le cas de www.spip.net)
parent 6545a4e9
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -226,15 +226,21 @@ function spip_release_lock($nom) { ...@@ -226,15 +226,21 @@ function spip_release_lock($nom) {
// //
function calcul_mysql_in($val, $valeurs, $not='') { function calcul_mysql_in($val, $valeurs, $not='') {
if (!$valeurs) return '0=0'; if (!$valeurs) return '0=0';
$s = split(',', $valeurs, 255);
if (count($s) < 255) { $n = $i = 0;
return ("($val $not IN ($valeurs))"); $chunk = array();
} else { while ($n = strpos($valeurs, ',', $n+1)) {
$valeurs = array_pop($s); if ((++$i) >= 255) {
return ("($val $not IN (" . join(',',$s) . "))\n" . $chunk = substr($valeurs, 0, $n);
($not ? "AND\t" : "OR\t") . $in_sql .= "($val $not IN (" . $chunk . "))\n" .
calcul_mysql_in($val, $valeurs, $not)); ($not ? "AND\t" : "OR\t");
} $valeurs = substr($valeurs, $n+1);
$i = $n = 0;
}
}
$in_sql .= "($val $not IN ($valeurs))";
return $in_sql;
} }
?> ?>
...@@ -106,10 +106,9 @@ function applique_invalideur($depart) { ...@@ -106,10 +106,9 @@ function applique_invalideur($depart) {
// ce qui evite des chevauchements dans la validation des forums // ce qui evite des chevauchements dans la validation des forums
// [ A valide un forum, B obtient de purger les invalides, et A // [ A valide un forum, B obtient de purger les invalides, et A
// trouve son cache avant que B n'ait eu le temps de le purger ] // trouve son cache avant que B n'ait eu le temps de le purger ]
if (!_DIR_RESTREINT) { ecrire_meta('invalider', 'oui');
ecrire_meta('invalider', 'oui'); ecrire_metas();
ecrire_metas(); if (_DIR_RESTREINT) {
} else {
include_local('inc-cache.php3'); include_local('inc-cache.php3');
retire_caches(); retire_caches();
} }
......
...@@ -97,7 +97,7 @@ function retire_cache($cache) { ...@@ -97,7 +97,7 @@ function retire_cache($cache) {
} }
// Supprimer les caches marques "x" // Supprimer les caches marques "x"
function retire_caches() { function retire_caches($chemin = '') {
if (!_DIR_RESTREINT) return; if (!_DIR_RESTREINT) return;
// signaler // signaler
...@@ -106,7 +106,18 @@ function retire_caches() { ...@@ -106,7 +106,18 @@ function retire_caches() {
// recuperer la liste des caches voues a la suppression // recuperer la liste des caches voues a la suppression
$suppr = array(); $suppr = array();
$q = spip_query("SELECT fichier FROM spip_caches WHERE type='x'");
// En priorite le cache qu'on appelle maintenant
if ($chemin) {
$q = spip_query("SELECT fichier FROM spip_caches
WHERE fichier = '".addslashes($chemin)."' AND type='x' LIMIT 0,1");
if ($r = spip_fetch_array($q))
$suppr[$r['fichier']] = true;
}
// Et puis une centaine d'autres
$q = spip_query("SELECT fichier FROM spip_caches
WHERE type='x' LIMIT 0,100");
while ($r = spip_fetch_array($q)) while ($r = spip_fetch_array($q))
$suppr[$r['fichier']] = true; $suppr[$r['fichier']] = true;
...@@ -116,6 +127,12 @@ function retire_caches() { ...@@ -116,6 +127,12 @@ function retire_caches() {
retire_cache($cache); retire_cache($cache);
spip_query("DELETE FROM spip_caches WHERE " spip_query("DELETE FROM spip_caches WHERE "
.calcul_mysql_in('fichier', "'".join("','",array_keys($suppr))."'") ); .calcul_mysql_in('fichier', "'".join("','",array_keys($suppr))."'") );
// signaler aux suivants
if ($n>99) {
ecrire_meta('invalider', 'oui');
ecrire_metas();
}
} }
} }
......
...@@ -150,7 +150,7 @@ function enregistre_forum() { ...@@ -150,7 +150,7 @@ function enregistre_forum() {
// verifier fichier lock // verifier fichier lock
$alea = preg_replace('/[^0-9]/', '', $alea); $alea = preg_replace('/[^0-9]/', '', $alea);
if (!file_exists($hash = _DIR_SESSIONS."forum_$alea.lck")) if (!file_exists($hash = _DIR_SESSIONS."forum_$alea.lck"))
exit; # echec silencieux du POST return $retour_forum; # echec silencieux du POST
unlink($hash); unlink($hash);
// Entrer le message dans la base // Entrer le message dans la base
......
...@@ -214,17 +214,17 @@ function afficher_page_globale ($fond, $delais, &$use_cache) { ...@@ -214,17 +214,17 @@ function afficher_page_globale ($fond, $delais, &$use_cache) {
$var_preview = false; $var_preview = false;
} }
// Calculer le chemin putatif du cache
$chemin_cache = generer_nom_fichier_cache('', $fond);
// Faut-il effacer des pages invalidees ? // Faut-il effacer des pages invalidees ?
if (lire_meta('invalider')) { if (lire_meta('invalider')) {
include_ecrire('inc_meta.php3'); include_ecrire('inc_meta.php3');
lire_metas(); lire_metas();
if (lire_meta('invalider')) if (lire_meta('invalider'))
retire_caches(); retire_caches($chemin_cache);
} }
// Calculer le chemin putatif du cache
$chemin_cache = generer_nom_fichier_cache('', $fond);
// Peut-on utiliser un fichier cache ? // Peut-on utiliser un fichier cache ?
determiner_cache($delais, $use_cache, $chemin_cache); determiner_cache($delais, $use_cache, $chemin_cache);
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter