Spip : éviter les erreurs 500

Bonjour,

Je recopie, ici, quelques astuces recommandées par Bernard Pabion. L’original se trouve ici : http://webnews.ouvaton.coop/article.php?id=1623&group=tech.spip#1623


Bonjour,
Comme le signale Bennet dans un fil un peu plus haut, il est possible de diminuer le nombre d’erreurs 500 engendrée par spip. Plus exactement les erreurs 500 correspondant à la partie publique du site (pour celles survenant dans l’espace privé, elle devraient être fortement améliorées par la mutualisation de spip, ce qui risque de prendre un peu de temps puisqu’il faut faire un greffon pour Gloux).

Pour cela, nous pouvons jouer sur 2 points

  • le recalcul des caches élémentaires
  • la suppression de l’écriture des log de spip.
  1. Les caches
    1.1. Eviter que tous les fichiers caches soient invalidé à chaque modification du site (vital pour les sites actifs) : ajouter la ligne
    $derniere_modif_invalide = false;
    dans le fichier config/mes_options.php (fichier que vous trouverez éventuellement dans le répertoire ecrire/)

1.2. Augmenter le délai de validiter des éléments de cache n’ayant pas de balise #CACHE{}. Par défaut, dans la version 1.9.2 de SPIP, ces éléments ont une validité d’une heure seulement… alors que certains de ces éléments contiennent des informations qui ne varies pratiquement jamais.
Pour passer ce délai à 24 heures, si vous êtes en version 1.9.2 de spip, il faut modifier le script ecrire/public/cacher.php (vers la ligne 203)
// $delais par defaut (pour toutes les pages sans #CACHE{})
if (!isset($GLOBALS’delais’])) $GLOBALS’delais’] = 3600;
et remplacer par (pour un délais de 24 heures)
// $delais par defaut (pour toutes les pages sans #CACHE{})
if (!isset($GLOBALS’delais’])) $GLOBALS’delais’] = 86400;

Si vous utilisez la version 1.9.3 de spip, le délais par défaut est déjà de 24 heures.

1.3 Mettre une balise #CACHE avec un grand délai (du style 1 mois : #CACHE{2592000} ) au début des éléments de squelette sans balise #CACHE dont les information ne change que très rarement : (dans le squelette par défaut, il s’agit notament des fichiers inc_head.html, inc_pied.html, inc_entete.html). En cas de modification radical du site, il suffira de demander le recalcul d’une page pour qu’ils soient mis à jour.

1.4 Vérifier que les délais de validité du cache des autres fichiers du squelette soient cohérent avec le fonctionnement du site… et voir si on ne pourrait pas les augmenter…

2 Les fichiers log.
Le fichier spip.log est mis à jour très fréqument (dès qu’il y a un calcul d’élément de page, une mise en cache d’un élément calculé, une opération effectuée par cron…) Il n’est utile que si on le consulte très fréquement car il ne conserve les données que quelques dizaines de minutes sur un site fréquenté… En revanche il peut ralentir considérablement un spip sur un plateforme en cluster comme Ouvaton, et ce en particulier pour les pages qui entraîne le plus d’erreur 500 (c’est à dire celles qui manipulent le plus de fichiers et effectuent le plus de calculs).
Je conseille donc vivement de supprimer ces enregistrements systématiques:

2.1 spip 1.9.2 :
commenter l’interieur de la fonction spip_log dans le fichier ecrire/inc/utils.php : Rajouter « /* » en début de fonction (ligne 161) et « / » en avant le « } » final (ligne 194). Comme si dessous :
// http://doc.spip.org/@spip_log
function spip_log($message, $logname=‘spip’) {
/
static $compteur;
if ($compteur++ > 100) return;

$pid = ‘(pid ‘.@getmypid().’)’;

// accepter spip_log( Array )
if (!is_string($message)) $message = var_export($message, true);

$message = date(“M d H:i:s”).’ ‘.$GLOBALS’ip’].’ ‘.$pid.’ '
.preg_replace("/\n*$/", “\n”, $message);

$logfile = _DIR_TMP . $logname . ‘.log’;
if (@is_readable($logfile)
AND (!$s = @filesize($logfile) OR $s > 10*1024)) {
$rotate = true;
$message .= “-- rotate --]\n”;
} else $rotate = ‘’;
$f = @fopen($logfile, “ab”);
if ($f) {
fputs($f, htmlspecialchars($message));
fclose($f);
}
if ($rotate) {
@unlink($logfile.’.3’);
@rename($logfile.’.2’,$logfile.’.3’);
@rename($logfile.’.1’,$logfile.’.2’);
@rename($logfile,$logfile.’.1’);
}

// recopier les spip_log mysql (ce sont uniquement des erreurs)
// dans le spip_log general
if ($logname == ‘mysql’)
spip_log($message);
*/}

2.2 SPIP 1.9.3
Il devrait suffire de rajouter le ligne suivante au fichier config/mes_options.php

$GLOBALS’nombre_de_logs’] = 0;

(ce qui permet de prendre en charge le cas particulier des spip mutualisé)

  1. Un troisième point est essentiel mais dépasse le cadre de ce déjà long message : les squelettes. Certains sont lourds (c’est le cas du squelette par défaut entre autres) et un squelette allégé (ce qui ne veut pas dire non fonctionnel) permettrait certainement d’éviter une bonne partie des ralentissements…

coop

Bernard Pabion


Christian.