Carnet Wiki

Valeurs Exemple de valeurs de retour d’un pour les cron (fonction pour tâches périodiques)

Version 2 — August 2021 JLuc

La documentation https://programmer.spip.net/Declarer-une-tache présente comment déclarer une tâche cron et sa périodicité.

La fonction implémentant un cron doit renvoyer une valeur dont le calcul n’est pas évident dans certains cas.

Cette page vise à collecter des exemples de calculs.

Déclanchement chaque jour à la même heure

l’API pour les tâches cron permet de facilement déclarer des périodicités pour les déclanchements, mais il est plus délicat de déclarer des heures de déclenchements fixes chaque jour. Voici une fonction qui aide à viser une heure spécifique pour le déclenchement d’une tâche.
Attention : cette fonction évite les dérives progressives en recalant le déclenchement chaque jour, mais elle ne garantit pas un déclenchement précis à l’heure programmée, car cela dépend de la fréquentation du site : sur un site sans fréquentation la tâche ne se déclenchera pas, sur un site ayant une faible fréquentation, elle se déclenchera en retard.

Voici une fonction qui aide à viser une heure spécifique pour le déclenchement d’une tâche. Le scénario dans lequel je m’en sers est le suivant :

-  lancement initial à une heure visée, avant minuit du J1 (exemple : 23h)
-  suite des lots pour éviter les timeout en utilisant queue_lancer_url_http_async() la nouvelle fonction du core pour lancer des url en asynchrone
-  ça peut s’interrompre à tout moment mais au plus tard le lendemain J+1 à une certaine heure
-  ça doit reprendre le soir de J+1 à la même heure qu’en J (et sans que des décalages ne puissent s’ajouter chaque jour).

// La date du prochain cron dépend de la valeur renvoyée par le génie
// ET de la déclaration de délais faite dans le pipeline taches_generales_cron
// Quand la valeur renvoyée par le génie > , la valeur précise est ignorée, c'est juste relancé avec le délai du pipeline
// Quand c'est négatif, la valeur absolue renvoyée indique l'heure considérée comme étant celle de la dernière exécution
// à partir de laquelle va s'appliquer le délai spécifié dans le pipeline
// Si le résultat est déjà dépassé, c'est programmé pour être exécuté tt de suite (dés que possible)
// Sinon ça prend la queue
//
// genie_vise_heure calcule la valeur de retour permettant une exécution du génie chaque jour à la même heure
// Les calculs ne marchent que pour une plage horaire nocturne (h_début < minuit, h_fin > minuit)
//
// @param $h_debut_cejour = mktime(CHAQUE_JOUR_H_DEBUT, , );
// @return valeur utilisable comme valeur de retour du genie 
function genie_vise_heure($h_debut_cejour) {
	$now = time();
	// $h_debut_cejour c'est 23h le même jour,
	// donc dans le passé il y a peu s'il est plus de 23h, mais dans 22h s'il est 1h du mat
	if ($now > $h_debut_cejour) {
		// S'il est entre 23h et minuit, quand ce sera fini il faudra que ça se relance "demain"
		// et donc garder le délai de 24h par rapport à 23h à ce soir
		return (0-$h_debut_cejour);
	}
	// sinon, par exemple il est 5h du mat ou 10h, on relance le soir même à 23h,
	// et donc il faut compenser le délai de 24h déjà ajouté à 23h ce soir
	return ( - ($h_debut_cejour - 24 * 3600)); // on veut que ce soit aujourd'hui donc on compense le délai normal de 24h
}