Bonjour,
Je recopie ici ce que je viens de poster sur : http://webnews.ouvaton.coop/article.php?id=2758&group=tech.spip#2758
Christian Domec wrote:
http://nom_du_site/spip.php?action=cron (il était même appelé deux fois de suite (certainement une erreur de squelette) dans l'un d'entre eux.
Que fait ce spip.php lorsqu'on attribue à la variable action la valeur cron ???
Par curiosité, j’ai poussé ma recherche un peu plus loin. J’ai téléchargé le dernier spip qui à nu fait déjà près de 10 Mo !!! (près 20 fois plus qu’à son origine).
J’ai bien trouvé le fichier qui lance le cron : cron.php ce fichier va envoyer des tâches chaque fois qu’il sera appelé en fonction de paramètres temporels (je ne sais pas s’ils peuvent être modifié ailleurs que dans le script).
L’écran d’aide à ce sujet précise (http://doc.spip.org/@spip_cron) :
fonction spip_cron ( $taches = array() )
Autodoc :
Gestion des taches de fond
Deux difficultes :
- la plupart des hebergeurs ne fournissent pas le Cron d’Unix
- les scripts usuels standard sont limites a 30 secondes Solution : les scripts usuels les plus brefs, en plus de livrer la page demandee, s’achevent par un appel a la fonction spip_cron. Celle-ci prend dans la liste des taches a effectuer la plus prioritaire. Une seule tache est executee pour eviter la guillotine des 30 secondes. Une fonction executant une tache doit retourner un nombre :
- nul, si la tache n’a pas a etre effecutee
- positif, si la tache a ete effectuee
- negatif, si la tache doit etre poursuivie ou recommencee Elle recoit en argument la date de la derniere execution de la tache. On peut appeler spip_cron avec d’autres taches (pour etendre Spip) specifiee par des fonctions respectant le protocole ci-dessus On peut modifier la frequence de chaque tache et leur ordre d’analyse en modifiant les variables ci-dessous.
Les taches sont dans un array (’nom de la tache’ => periodicite) Cette fonction execute la tache la plus urgente (celle dont la date de derniere execution + la periodicite est minimale) sous reserve que le serveur MySQL soit actif. La date de la derniere intervention est donnee par un fichier homonyme, de suffixe “.lock”, modifie a chaque intervention et des le debut de celle-ci afin qu’un processus concurrent ne la demarre pas aussi. Les taches les plus longues sont tronconnees, ce qui impose d’antidater le fichier de verrouillage (avec la valeur absolue du code de retour). La fonction executant la tache est un homonyme de prefixe “cron_” Le fichier homonyme de prefixe “inc_” est automatiquement charge si besoin, et est supposee la definir si ce n’est fait ici.
On voit ainsi qu’il peut parfois s’agir d’un script très gourmand.
Dans le fichier source j’ai regardé un peu les tâches et leur périodicité en secondes par défaut (je recopie ici une partie de cron.php décrivant la fonction taches_generales() et la fonction cron_optimiser()) :
Construction de la liste des taches.
// la cle est la tache, la valeur le temps minimal, en secondes, entre
// deux memes taches
// NE PAS METTRE UNE VALEUR INFERIEURE A 30 (cf ci-dessus)
//
// http://doc.spip.org/@taches_generales
function taches_generales() {
$taches_generales = array();
// MAJ des rubriques publiques (cas de la publication post-datee)
$taches_generales’rubriques’] = 3600;
// Optimisation de la base
$taches_generales’optimiser’] = 3600*48;
// cache
$taches_generales’invalideur’] = 3600;
// nouveautes
if ($GLOBALS’meta’]‘adresse_neuf’] AND $GLOBALS’meta’]‘jours_neuf’]
AND ($GLOBALS’meta’]‘quoi_de_neuf’] == ‘oui’))
$taches_generales’mail’]= 3600 * 24 * $GLOBALS’meta’]‘jours_neuf’];
// stats : toutes les 5 minutes on peut vider un panier de visites
if ($GLOBALS’meta’]“activer_statistiques”] == “oui”) {
$taches_generales’visites’] = 300; $taches_generales’popularites’] = 7200; # calcul lourd
}
// syndication
if ($GLOBALS’meta’]“activer_syndic”] == “oui”) $taches_generales’syndic’] = 90;
// indexation
if ($GLOBALS’meta’]“activer_moteur”] == “oui”) $taches_generales’indexation’] = 90;
// maintenance (ajax, verifications diverses)
$taches_generales’maintenance’] = 3600 * 2;
return pipeline(‘taches_generales_cron’,$taches_generales);
}
// Cas particulier : optimiser est dans base/optimiser, et pas dans inc/
// il faut donc definir la fonction _cron ici.
// http://doc.spip.org/@cron_optimiser
function cron_optimiser($t) {
include_spip(‘base/optimiser’);
optimiser_base();
return 1;
}
Sans aller plus avant dans les scripts de spip, je me rends compte qu’à première vue ils sont excessivement gourmands. Il n’est pas tout à fait étonnant que des “internal error” apparaissent (les commentaires du script sont d’ailleurs éloquants).
Christian.