X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fgenie.php;fp=www%2Fecrire%2Finc%2Fgenie.php;h=3a72e8c5ed5a9ef888e185b1c40a9c7d0d1cb4b9;hb=4f443dce95ff6f8221c189880a70c74ce1c1f238;hp=4ba26080048382297ec114777c04c70dd817e52b;hpb=4a628e9b277d3617535f99d663ca79fa2e891177;p=lhc%2Fweb%2Fwww.git diff --git a/www/ecrire/inc/genie.php b/www/ecrire/inc/genie.php index 4ba26080..3a72e8c5 100644 --- a/www/ecrire/inc/genie.php +++ b/www/ecrire/inc/genie.php @@ -3,70 +3,96 @@ /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * - * Copyright (c) 2001-2016 * + * Copyright (c) 2001-2017 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; - -// -------------------------- -// Gestion des taches de fond -// -------------------------- - -// Deux difficultes: -// - la plupart des hebergeurs ne fournissent pas le Cron d'Unix -// - les scripts usuels standard sont limites a 30 secondes - -// Solution: -// Toute connexion a SPIP s'acheve par un appel a la fonction cron() -// qui appelle la fonction surchargeable genie dans inc/ -// Sa definition standard ci-dessous prend dans une liste de taches -// la plus prioritaire, leurs dates etant donnees par leur fichier-verrou. -// Une fonction executant une tache doit retourner un nombre: -// - nul, si la tache n'a pas a etre effecutee -// - positif, si la tache a ete effectuee -// - negatif, si la tache doit etre poursuivie ou recommencee -// Elle recoit en argument la date de la derniere execution de la tache. - -// On peut appeler cette fonction avec d'autres taches (pour etendre Spip) -// specifiee par des fonctions respectant le protocole ci-dessus -// On peut modifier la frequence de chaque tache et leur ordre d'analyse -// en modifiant les variables ci-dessous. - -//---------- - -// Les taches sont dans un tableau ('nom de la tache' => periodicite) -// Cette fonction execute la tache la plus urgente -// (celle dont la date de derniere execution + la periodicite est minimale) -// La date de la derniere intervention est donnee par un fichier homonyme, -// de suffixe ".lock", modifie a chaque intervention et des le debut -// de celle-ci afin qu'un processus concurrent ne la demarre pas aussi. -// Les taches les plus longues sont tronconnees, ce qui impose d'antidater -// le fichier de verrouillage (avec la valeur absolue du code de retour). -// La fonction executant la tache est un homonyme de prefixe "genie_". -// Le fichier homonyme du repertoire "genie/" est automatiquement lu -// et il est suppose definir cette fonction. - -// http://doc.spip.org/@inc_genie_dist +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} + +/** + * Gestion des tâches de fond + * + * Deux difficultés : + * - la plupart des hebergeurs ne fournissent pas le Cron d'Unix + * - les scripts usuels standard sont limites à 30 secondes + * + * Solution + * -------- + * Toute connexion à SPIP s'achève par un appel (asynchrone si possible) + * à la fonction `cron()` qui appelle la fonction surchargeable `inc_genie_dist()` + * + * Sa définition standard ci-dessous prend dans une liste de tâches + * la plus prioritaire. + * + * Une fonction exécutant une tâche doit retourner un nombre : + * - nul, si la tache n'a pas à être effecutée + * - positif, si la tache a été effectuée + * - négatif, si la tache doit être poursuivie ou recommencée + * + * Elle recoit en argument la date de la dernière exécution de la tâche. + * + * On peut appeler cette fonction avec d'autres tâches (pour étendre SPIP) + * spécifiée par des fonctions respectant le protocole ci-dessus. + * + * On peut ajouter des tâches périodiques ou modifier la fréquence + * de chaque tâche et leur priorité en utilisant le pipeline + * `taches_generales_cron`. + * + * On peut également directement en déclarer avec la balise `genie` d'un paquet.xml + * de plugin, tel que `` + * + * @package SPIP\Core\Genie + **/ + + +/** + * Prévoit l'exécution de la tâche cron la plus urgente + * + * Les tâches sont dans un tableau `'nom de la tâche' => périodicité` + * + * Cette fonction exécute la tache la plus urgente, c'est à dire + * celle dont la date de dernière exécution + la périodicité est minimale. + * + * La date de la prochaîne exécution de chaque tâche est indiquée dans la + * table SQL `spip_jobs` + * + * La fonction exécutant la tâche est (généralement) un homonyme de préfixe "genie_". + * Le fichier homonyme du repertoire "genie/" est automatiquement lu + * et il est supposé définir cette fonction. + * + * @uses queue_add_job() Lorsqu'une tâche est à forcer + * @uses queue_schedule() + * @see taches_generales() Liste des tâches déclarées + * + * @param array $taches + * Tâches dont on force maintenant l'exécution le plus tôt possible. + * Sinon, prendra la tâche la plus prioritaire. + * @return + **/ function inc_genie_dist($taches = array()) { include_spip('inc/queue'); - if (_request('exec')=='job_queue') + if (_request('exec') == 'job_queue') { return false; + } $force_jobs = array(); // l'ancienne facon de lancer une tache cron immediatement // etait de la passer en parametre a ing_genie_dist // on reroute en ajoutant simplement le job a la queue, ASAP - foreach($taches as $function=>$period) - $force_jobs[] = queue_add_job($function, _T('tache_cron_asap', array('function'=>$function)), array(time()-abs($period)), "genie/"); - + foreach ($taches as $function => $period) { + $force_jobs[] = queue_add_job($function, _T('tache_cron_asap', array('function' => $function)), + array(time() - abs($period)), "genie/"); + } + // et on passe la main a la gestion de la queue ! // en forcant eventuellement les jobs ajoute a l'instant - return queue_schedule(count($force_jobs)?$force_jobs:null); + return queue_schedule(count($force_jobs) ? $force_jobs : null); } // @@ -77,74 +103,87 @@ function inc_genie_dist($taches = array()) { // les serveurs Http n'accordant en general pas plus de 30 secondes // a leur sous-processus // -// http://doc.spip.org/@taches_generales +// http://code.spip.net/@taches_generales function taches_generales($taches_generales = array()) { // verifier que toutes les taches cron sont planifiees // c'est une tache cron ! - $taches_generales['queue_watch'] = 3600*24; + $taches_generales['queue_watch'] = 3600 * 24; // MAJ des rubriques publiques (cas de la publication post-datee) // est fait au coup par coup a present // $taches_generales['rubriques'] = 3600; // Optimisation de la base - $taches_generales['optimiser'] = 3600*48; + $taches_generales['optimiser'] = 3600 * 48; // cache (chaque 10 minutes => 1/16eme du repertoire cache, // soit toutes les 2h40 sur le meme rep) $taches_generales['invalideur'] = 600; // nouveautes - if ($GLOBALS['meta']['adresse_neuf'] AND $GLOBALS['meta']['jours_neuf'] - AND ($GLOBALS['meta']['quoi_de_neuf'] == 'oui')) - $taches_generales['mail']= 3600 * 24 * $GLOBALS['meta']['jours_neuf']; + if (isset($GLOBALS['meta']['adresse_neuf']) and $GLOBALS['meta']['adresse_neuf'] + and $GLOBALS['meta']['jours_neuf'] + and ($GLOBALS['meta']['quoi_de_neuf'] == 'oui') + ) { + $taches_generales['mail'] = 3600 * 24 * $GLOBALS['meta']['jours_neuf']; + } // maintenance (ajax, verifications diverses) $taches_generales['maintenance'] = 3600 * 2; // verifier si une mise a jour de spip est disponible (2 fois par semaine suffit largement) - $taches_generales['mise_a_jour'] = 3*24*3600; + $taches_generales['mise_a_jour'] = 3 * 24 * 3600; - return pipeline('taches_generales_cron',$taches_generales); + return pipeline('taches_generales_cron', $taches_generales); } // Pas de fichier a part pour une fonction aussi petite: // - elle peut retirer les fichiers perimes // - elle fait appliquer le quota // En cas de quota sur le CACHE/, nettoyer les fichiers les plus vieux -// http://doc.spip.org/@genie_invalideur_dist +// http://code.spip.net/@genie_invalideur_dist function genie_invalideur_dist($t) { include_spip('inc/invalideur'); $encore = appliquer_quota_cache(); // si le cache est trop gonfle, redemander la main pour poursuivre - if ($encore) + if ($encore) { return (0 - $t); + } + 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() + * Une tâche périodique pour surveiller les tâches crons et les relancer si besoin + * + * Quand ce cron s'execute, il n'est plus dans la queue, donc il se replanifie + * lui même, avec last=time() * avec une dose d'aleatoire pour ne pas planifier toutes les taches au meme moment * + * @uses taches_generales() + * @uses queue_genie_replan_job() + * * @return int */ -function genie_queue_watch_dist(){ +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) + 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); + $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; } @@ -165,24 +204,26 @@ function genie_queue_watch_dist(){ * priorite * @return void */ -function queue_genie_replan_job($function,$period,$last=0,$time=null, $priority=0){ +function queue_genie_replan_job($function, $period, $last = 0, $time = null, $priority = 0) { static $done = array(); - if (isset($done[$function])) return; + if (isset($done[$function])) { + return; + } $done[$function] = true; - if (is_null($time)){ - $time=time(); - if ($last) - $time = max($last+$period,$time); + if (is_null($time)) { + $time = time(); + if ($last) { + $time = max($last + $period, $time); + } + } + if (!$last) { + $last = $time - $period; } - if (!$last) - $last = $time-$period; - spip_log("replan_job $function $period $last $time $priority",'queue'); + spip_log("replan_job $function $period $last $time $priority", 'queue'); include_spip('inc/queue'); // on replanifie un job cron // uniquement si il n'y en a pas deja un avec le meme nom // independament de l'argument - queue_add_job($function, _T('tache_cron_secondes', array('function'=>$function, 'nb'=>$period)), array($last), "genie/", 'function_only', $time, $priority); + queue_add_job($function, _T('tache_cron_secondes', array('function' => $function, 'nb' => $period)), array($last), + "genie/", 'function_only', $time, $priority); } - - -?>