[SPIP] +2.1.12
[velocampus/web/www.git] / www / ecrire / inc / genie.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2011 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 // --------------------------
16 // Gestion des taches de fond
17 // --------------------------
18
19 // Deux difficultes:
20 // - la plupart des hebergeurs ne fournissent pas le Cron d'Unix
21 // - les scripts usuels standard sont limites a 30 secondes
22
23 // Solution:
24 // Toute connexion a SPIP s'acheve par un appel a la fonction cron()
25 // qui appelle la fonction surchargeable genie dans inc/
26 // Sa definition standard ci-dessous prend dans une liste de taches
27 // la plus prioritaire, leurs dates etant donnees par leur fichier-verrou.
28 // Une fonction executant une tache doit retourner un nombre:
29 // - nul, si la tache n'a pas a etre effecutee
30 // - positif, si la tache a ete effectuee
31 // - negatif, si la tache doit etre poursuivie ou recommencee
32 // Elle recoit en argument la date de la derniere execution de la tache.
33
34 // On peut appeler cette fonction avec d'autres taches (pour etendre Spip)
35 // specifiee par des fonctions respectant le protocole ci-dessus
36 // On peut modifier la frequence de chaque tache et leur ordre d'analyse
37 // en modifiant les variables ci-dessous.
38
39 //----------
40
41 // Les taches sont dans un tableau ('nom de la tache' => periodicite)
42 // Cette fonction execute la tache la plus urgente
43 // (celle dont la date de derniere execution + la periodicite est minimale)
44 // La date de la derniere intervention est donnee par un fichier homonyme,
45 // de suffixe ".lock", modifie a chaque intervention et des le debut
46 // de celle-ci afin qu'un processus concurrent ne la demarre pas aussi.
47 // Les taches les plus longues sont tronconnees, ce qui impose d'antidater
48 // le fichier de verrouillage (avec la valeur absolue du code de retour).
49 // La fonction executant la tache est un homonyme de prefixe "genie_".
50 // Le fichier homonyme du repertoire "genie/" est automatiquement lu
51 // et il est suppose definir cette fonction.
52
53 // http://doc.spip.org/@inc_genie_dist
54 function inc_genie_dist($taches = array()) {
55
56 if (!$taches)
57 $taches = taches_generales();
58
59 // Quelle est la tache la plus urgente ?
60 $tache = '';
61 $tmin = $t = time();
62 foreach ($taches as $nom => $periode) {
63 $celock = _DIR_TMP . $nom . '.lock';
64 $date_lock = @filemtime($celock);
65 if ($date_lock + $periode < $tmin) {
66 $tmin = $date_lock + $periode;
67 $tache = $nom;
68 $lock = $celock;
69 $last = $date_lock;
70 }
71 // debug : si la date du fichier est superieure a l'heure actuelle,
72 // c'est que les serveurs Http et de fichiers sont desynchro.
73 // Ca peut mettre en peril les taches cron : signaler dans le log
74 // (On laisse toutefois flotter sur une heure, pas la peine de s'exciter
75 // pour si peu)
76 else if ($date_lock > $t + 3600)
77 spip_log("Erreur de date du fichier $lock : $date_lock > $t !");
78 }
79 if ($tache) {
80 spip_timer('tache');
81 spip_log('cron: debut '.$tache, 'genie');
82 touch($lock);
83 $cron = charger_fonction($tache, 'genie');
84 $retour = $cron($last);
85 // si la tache a eu un effet : log
86 if ($retour) {
87 spip_log("cron: $tache (" . spip_timer('tache') . ") $retour", 'genie');
88 if ($retour < 0)
89 @touch($lock, 0 - $retour);
90 }
91 }
92 }
93
94 //
95 // Construction de la liste des taches.
96 // la cle est la tache,
97 // la valeur le temps minimal, en secondes, entre deux memes taches
98 // NE PAS METTRE UNE VALEUR INFERIEURE A 30
99 // les serveurs Http n'accordant en general pas plus de 30 secondes
100 // a leur sous-processus
101 //
102 // http://doc.spip.org/@taches_generales
103 function taches_generales($taches_generales = array()) {
104
105 // MAJ des rubriques publiques (cas de la publication post-datee)
106 // est fait au coup par coup a present
107 // $taches_generales['rubriques'] = 3600;
108
109 // Optimisation de la base
110 $taches_generales['optimiser'] = 3600*48;
111
112 // cache (chaque 20 minutes => 1/16eme du repertoire cache)
113 $taches_generales['invalideur'] = 1200;
114
115 // nouveautes
116 if ($GLOBALS['meta']['adresse_neuf'] AND $GLOBALS['meta']['jours_neuf']
117 AND ($GLOBALS['meta']['quoi_de_neuf'] == 'oui'))
118 $taches_generales['mail']= 3600 * 24 * $GLOBALS['meta']['jours_neuf'];
119
120 // stats : toutes les 5 minutes on peut vider un panier de visites
121 if ($GLOBALS['meta']["activer_statistiques"] == "oui") {
122 $taches_generales['visites'] = 300;
123 $taches_generales['popularites'] = 7200; # calcul lourd
124 }
125
126 // syndication
127 if ($GLOBALS['meta']["activer_syndic"] == "oui")
128 $taches_generales['syndic'] = 90;
129
130 // maintenance (ajax, verifications diverses)
131 $taches_generales['maintenance'] = 3600 * 2;
132
133 // verifier si une mise a jour de spip est disponible (2 fois par semaine suffit largement)
134 $taches_generales['mise_a_jour'] = 3*24*3600;
135
136 return pipeline('taches_generales_cron',$taches_generales);
137 }
138
139 // Pas de fichier a part pour une fonction aussi petite:
140 // - elle peut retirer les fichiers perimes
141 // - elle fait appliquer le quota
142 // En cas de quota sur le CACHE/, nettoyer les fichiers les plus vieux
143 // http://doc.spip.org/@genie_invalideur_dist
144 function genie_invalideur_dist($t) {
145
146 include_spip('inc/invalideur');
147 $encore = appliquer_quota_cache();
148
149 // si le cache est trop gonfle, redemander la main pour poursuivre
150 if ($encore)
151 return (0 - $t);
152 return 1;
153 }
154 ?>