Carnet Wiki

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

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.

Rappel

(Voir https://programmer.spip.net/100 )
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 est positive, la valeur précise est ignorée, c’est juste relancé avec le délai du pipeline
-  Quand elle est négative, la valeur absolue renvoyée indique l’heure considérée par le génie comme étant celle de la dernière exécution et à partir de laquelle va s’appliquer le délai spécifié dans le pipeline. Et si le résultat est déjà dépassé, c’est programmé pour être exécuté tout de suite (dés que possible). Sinon ça prend la queue.

Déclenchement chaque jour à la même heure environ

L’API pour les tâches cron permet de facilement déclarer des périodicités pour les déclenchements, 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 fixe pour le déclenchement d’une tâche chaque jour J à une heure HH (exemple : 23).
-  Comme c’est un lancement quotidien, le délai pour ce cron est de 24h.
-  Dans le code, la constante CHAQUE_JOUR_H_DEBUT vaut l’heure de déclenchement HH.
Exemple : define ('CHAQUE_JOUR_H_DEBUT', 23);
-  Le jour suivant J+1, un nouveau lancement doit se faire à la même heure HH visée environ, sans que le décalage de J ne s’ajoute au nouveau décalage de J+1.

Cette fonction évite les dérives progressives en recalant le déclenchement chaque jour, mais elle ne garantit pas que le déclenchement se fasse précisément à 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.

/**
 * genie_vise_heure calcule la valeur de retour permettant une exécution du génie 
 * chaque jour à la même heure environ
 * @param $h_debut_cejour = mktime(CHAQUE_JOUR_H_DEBUT, 0, 0);  =HH, par ex 23
 * @return valeur utilisable comme valeur de retour du genie 
*/
function genie_vise_heure($h_debut_cejour) {
  $now = time();
  // $h_debut_cejour c'est l'heure de début visée du même jour,
  // ça peut être déjà passé ou pas encore
  if ($now > $h_debut_cejour) {
    // Si c'est passé, il faudra relancer "demain"
    // et donc on garde le délai de 24h par rapport à HH à ce soir
    return (0-$h_debut_cejour);
  }
  // sinon, c'est qu'il y a eu un grand retard
  // on veut relancer le jour même à HH environ
  // et donc il faut compenser le délai de 24h déjà ajouté à HH ce soir
  return (0 - ($h_debut_cejour - 24 * 3600)); 
} 
JLuc - Mise à jour :31 August 2021 at 15:41