Déclarer une tâche

Il y a 2 manières de déclarer une tâche et sa périodicité :

  1. avec le pipeline taches_generales_cron.
  2. avec la balise <genie> dans le fichier paquet.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).

Exemple

Exemple
Sur le wiki : Programmer une tâche cron sans dérive horaire.

Auteur JLuc, Matthieu Marcillaud Publié le : Mis à jour : 12/03/23

Traductions : English, français