Il y a 2 manières de déclarer une tâche et sa périodicité :
- avec le pipeline
taches_generales_cron
. - avec la balise
<genie>
dans le fichierpaquet.xml
.
Avec le pipeline taches_generales_cron
Pour déclarer une tâche, on peut indiquer son nom et sa périodicité en secondes via le pipeline taches_generales_cron
:
function monplugin_taches_generales_cron($taches){
$taches['nomdelatache'] = 24*3600; // tous les jours
return $taches;
}
Cette tâche sera appelée au moment venu. Les traitements sont placés dans un fichier du répertoire genie/
, homonyme à la tâche (nomdelatache.php
) et disposant d’une fonction genie_nomdelatache_dist()
.
La fonction reçoit en argument la date à laquelle s’est réalisé le dernier traitement de cette tâche. Elle doit retourner un nombre :
- nul, si la tâche n’a rien à faire
- positif, si la tâche a été traitée
- négatif, si la tâche a commencé, mais doit se poursuivre. Cela permet d’effectuer des tâches par lots (pour éviter des timeout sur les exécutions des scripts PHP à cause de traitements trop longs). Dans ce cas là, la valeur absolue du nombre négatif indiqué doit être le timestamp de la dernière exécution de la tâche à partir duquel doit s’appliquer le délai spécifié dans le pipeline
taches_generales_cron
pour définir le moment de la prochaine exécution.
Exemple
Cet exemple est simple, issu des tâches de « maintenance » de SPIP, dans le fichier genie/maintenance.php
, puisqu’il exécute des fonctions et renvoie toujours 1
, indiquant que l’action a été réalisée.
// Diverses taches de maintenance
function genie_maintenance_dist ($t) {
// (re)mettre .htaccess avec deny from all
// dans les deux repertoires dits inaccessibles par http
include_spip('inc/acces');
verifier_htaccess(_DIR_ETC);
verifier_htaccess(_DIR_TMP);
// Verifier qu'aucune table n'est crashee
if (!_request('reinstall'))
verifier_crash_tables();
return 1;
}
Avec la balise <genie>
On peut également déclarer la tâche dans un plugin en ajoutant dans le fichier paquet.xml
une balise <genie>
avec les attributs "nom" et "periode".
La tâche déclarée sera alors appelée avec la périodicité indiquée.
Attention
Le traitement doit également être placé dans un fichier du répertoire genie/
, mais par rapport au nom de fichier lorsque la tâche est déclarée par le pipeline, le nom du fichier doit être préfixé par le préfixe du plugin : prefixeplugin_nomdelatache.php
.
De même, il faut ajouter le préfixe du plugin dans le nom de la fonction : genie_prefixeplugin_nomdelatache_dist()
.
Exemple
Dans le plugin ipset, le fichier paquet.xml
contient la ligne suivante :
<genie nom="accessip" periode="86400" />
.
Et le fichier genie/ipset_accessip.php
définit la fonction
genie_ipset_accessip_dist($t)
.