Version 1 — Août 2021 — JLuc — Version initiale
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
}