Carnet Wiki

Exemple de valeurs de retour pour les cron (tâches périodiques)

Version 1 — August 2021 JLuc — Version initiale

Déclanchement chaque jour à la même heure

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 > 0, 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, 0, 0);
// @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 (0 - ($h_debut_cejour - 24 * 3600)); // on veut que ce soit aujourd'hui donc on compense le délai normal de 24h
}