Carnet Wiki

SpipCron

Version 9 — Mars 2014 — 176.181.xx.xx

Cette balise est maintenant documentée dans la doc officielle

Pour résumer les explications (lab.spip.net), la gestion des tâches de fond se déclenche à travers une image transparente (envoyée par spip_background.php3) en background-image d’une <div> de 1 pixel.

Pour cela il faut mettre #SPIP_CRON quelque part dans le squelette d’une page relativement fréquentée (par exemple sommaire.html ou article.html) pour que les tâches de fond soient presque toujours traitées par cette astuce.

Si on ne met pas #SPIP_CRON dans un squelette, alors les tâches de fond s’exécutent comme avant, c’est-à-dire à la fin de l’envoi des pages. L’inconvénient est que cela peut se traduire par des pages lentes pour les visiteurs qui n’ont pas de chance.

Pour les bidouilleurs qui veulent ajouter une tâche dans la liste, l’API est expliquée dans spip_background et
inc_cron .

[YvesGrenier] J’ajoute ici des explications concernant #SPIP_CRON et la syndication.

J’ai eu l’impression qu’il y avait potentiellement une confusion entre deux temps successifs de la syndication. Je vais essayer de clarifier un peu le mécanisme de la syndication à partir de ce que j’ai compris du code de spip.

Il y a dans la syndication deux temps nettement disjoints :

1) le moment où spip aspire, à partir des sites syndiqués, les infos sur les nouveaux articles publiés sur ces sites, et les stocke dans la base,
2) le moment où spip affiche ces informations, au moyen d’une boucle dans un squelette lors du calcul ou du recalcul de la page.

J’insiste : ces deux temps sont nettement disjoints. Le premier est effectué soit au moment où on syndique le site pour la première fois, soit si on clique sur « mettre à jour maintenant » depuis l’espace privé, soit en tâche de fond quand un visiteur charge un page dont le squelette contient la balise #SPIP_CRON. Il suffit donc d’avoir mis cette balise dans le squelette d’une page souvent visitée (exemple sommaire.html ou article.html) pour qu’une visite déclenche en arrière plan une tâche qui est prise dans une liste qui comprend la syndication (entre autres). Cette balise fabrique une image invisible. Elle peut être mise un peu n’importe où dans la page. D’ailleurs, si elle a la syntaxe d’une balise, elle se comporte plutôt comme une sonnette qui appellerait les tâches de fond (les petits nains qui travaillent dans la mine).

Dans le deuxième temps (calcul de la page via le squelette), spip utilise uniquement les infos stockées dans la base pour afficher les sites syndiqués. Il n’y a aucune mise à jour des sites dans ce cas. Inutile donc de mettre la balise #SPIP_CRON dans une page qui affiche les sites ou articles syndiqués, puisque aspiration et affichage se font dans des temps complètement différents. Ce temps ne fera apparaître de nouvelles informations que si entre temps la tâche de fond est allé rechercher des infos depuis les sites syndiqués. La tâche de fond est cachée, ni le visiteur dans la partie publique, ni l’admin dans la partie privée ne la voient. Sa seule trace est dans le fichier spip.log (répertoire /ecrire/data/).

Ajouter une tâche de fond dans un plugin

[le 26/11/07, william a écrit sur spip-zone :]

Pour ajouter un CRON à un plugin SPIP il y a plusieurs possibilités (qui fonctionnent aussi bien en 192 qu’en 193) :

1) Déclarer le pipeline ’taches_generales_cron’ dans le plugin.xml comme suit :

<blockquote class="spip">
<pipeline>
	<nom>taches_generales_cron</nom>
</pipeline>
</blockquote>

2) Création du CRON : créer un fichier xxx_cron.php dans le répertoire
de /inc de votre plugin (1- où xxx est le prefix utilisé par votre
plugin et déclarer dans le plugin.xml 2- Je sais pas si c’est
strictement nécessaire que le fichier soient nommé ainsi et s’il doit
être obligatoirement dans /inc, mais en général c’est sous cette forme
qu’on le trouve)

Dans ce fichier déclarez votre fonction cron :

<blockquote class="spip">
/*Le cron_ dans le nom de la fonction est obligatoire*/
function cron_xxx_cron($t){
	// Code d'éxécution du cron
	return 1; /* la fonction cron dois toujours retourner 1. Surement pour 
indiquer à spip qu'il s'est bien terminé*/
}
</blockquote>

3)Dans le fichier mes_options de votre plugin vous déclarez la fonction
de taches_generales_cron comme suit (où xxx est le prefix utiliser par
votre plugin et déclarer dans le plugin.xml) :

<blockquote class="spip">

<code </code >// le fichier de la fonction cron dans l’étape 2
include_spip(’inc/xxx_cron’) ;

function xxx_taches_generales_cron($taches_generales)
// xxx_cron est la function cron qu’on a déclarer à l’étape 2
// 60 est le temps de la prochaine exécution du cron en secondes
// ici le cron s’éxécute chaque minutes
$taches_generales[’xxx_cron’] = 60 ;
return $taches_generales ;

</blockquote>

N’oubliez pas que le cron s’exécute quand on parcourt la partie publique du site
et donc, sauf erreur de ma part, ça fonctionne pas dans la partie privé.

[/fin des explications de william]