function inc_genie_dist($taches = array()) { if (!$taches) $taches = taches_generales(); // Quelle est la tache la plus urgente ? $tache = ''; $tmin = $t = time(); foreach ($taches as $nom => $periode) { $celock = _DIR_TMP . $nom . '.lock'; $date_lock = @filemtime($celock); if ($date_lock + $periode < $tmin) { $tmin = $date_lock + $periode; $tache = $nom; $lock = $celock; $last = $date_lock; } // debug : si la date du fichier est superieure a l'heure actuelle, // c'est que les serveurs Http et de fichiers sont desynchro. // Ca peut mettre en peril les taches cron : signaler dans le log // (On laisse toutefois flotter sur une heure, pas la peine de s'exciter // pour si peu) else if ($date_lock > $t + 3600) spip_log("Erreur de date du fichier $lock : $date_lock > $t !"); } if ($tache) { spip_timer('tache'); spip_log('cron: debut '.$tache, 'genie'); touch($lock); $cron = charger_fonction($tache, 'genie'); $retour = $cron($last); // si la tache a eu un effet : log if ($retour) { spip_log("cron: $tache (" . spip_timer('tache') . ") $retour", 'genie'); if ($retour < 0) @touch($lock, 0 - $retour); } } }
/** * Une tache periodique pour surveiller les taches crons et les relancer si besoin * quand ce cron s'execute, il n'est plus dans la queue, donc il se replanifie * lui meme, avec last=time() * avec une dose d'aleatoire pour ne pas planifier toutes les taches au meme moment * * @return int */ function genie_queue_watch_dist() { static $deja_la = false; if ($deja_la) { return; } // re-entrance si l'insertion des jobs echoue (pas de table spip_jobs a l'upgrade par exemple) $deja_la = true; $taches = taches_generales(); $programmees = sql_allfetsel('fonction', 'spip_jobs', sql_in('fonction', array_keys($taches))); $programmees = array_map('reset', $programmees); foreach ($taches as $tache => $periode) { if (!in_array($tache, $programmees)) { queue_genie_replan_job($tache, $periode, time() - round(rand(1, $periode)), 0); } } $deja_la = false; return 1; }
/** * Une tache periodique pour surveiller les taches crons et les relancer si besoin * quand ce cron s'execute, il n'est plus dans la queue, donc il se replanifie * lui meme, avec last=time() * avec une dose d'aleatoire pour ne pas planifier toutes les taches au meme moment * * @return int */ function genie_queue_watch_dist() { static $deja_la = false; if ($deja_la) { return; } // re-entrance si l'insertion des jobs echoue (pas de table spip_jobs a l'upgrade par exemple) $deja_la = true; $taches = taches_generales(); foreach ($taches as $tache => $periode) { queue_genie_replan_job($tache, $periode, time() - round(rand(1, $periode))); } $deja_la = false; return 1; }
/** * Tester si une tâche était une tâche périodique à reprogrammer * * @uses taches_generales() * * @param string $function * Nom de la fonction de tâche * @param string $inclure * Nom de l'inclusion contenant la fonction * @return bool|int * Périodicité de la tâche en secondes, si tâche périodique, sinon false. */ function queue_is_cron_job($function, $inclure) { static $taches = null; if (strncmp($inclure, 'genie/', 6) == 0) { if (is_null($taches)) { include_spip('inc/genie'); $taches = taches_generales(); } if (isset($taches[$function])) { return $taches[$function]; } } return false; }