source: spip-zone/_plugins_/stats_data/stats_data_options.php @ 109320

Last change on this file since 109320 was 109320, checked in by booz@…, 16 months ago

on passe par mes_options sinon la surchrage echoue on dirait

File size: 10.2 KB
Line 
1<?php
2
3
4function genie_popularites($t) {
5        include_spip('genie/popularites'); // ?
6        // Si c'est le premier appel, ne pas calculer
7        $t = $GLOBALS['meta']['date_popularites'];
8        ecrire_meta('date_popularites', time());
9
10        if (!$t) {
11                return 1;
12        }
13
14        $duree = time() - $t;
15        list($a, $b) = genie_popularite_constantes($duree);
16
17        // du passe, faisons table (SQL) rase
18        sql_update('spip_articles', array('maj' => 'maj', 'popularite' => "popularite * $a"), 'popularite>1');
19
20        // enregistrer les metas...
21        $row = sql_fetsel('MAX(popularite) AS max, SUM(popularite) AS tot', "spip_articles");
22        ecrire_meta("popularite_max", $row['max']);
23        ecrire_meta("popularite_total", $row['tot']);
24
25        // Une fois par jour purger les referers du jour ; qui deviennent
26        // donc ceux de la veille ; au passage on stocke une date_statistiques
27        // dans spip_meta - cela permet au code d'etre "reentrant", ie ce cron
28        // peut etre appele par deux bases SPIP ne partageant pas le meme
29        // _DIR_TMP, sans tout casser...
30
31        $aujourdhui = date("Y-m-d");
32        if (($d = $GLOBALS['meta']['date_statistiques']) != $aujourdhui) {
33               
34                spip_log("Popularite: purger referer depuis $d");
35                ecrire_meta('date_statistiques', $aujourdhui);
36                if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) == 0) {
37                        spip_query("UPDATE spip_referers SET visites_veille=visites_jour, visites_jour=0");
38                } else
39                        // version 3 fois plus rapide, mais en 2 requetes
40                        #spip_query("ALTER TABLE spip_referers CHANGE visites_jour visites_veille INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',CHANGE visites_veille visites_jour INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
41                        #spip_query("UPDATE spip_referers SET visites_jour=0");
42                        // version 4 fois plus rapide que la premiere, en une seule requete
43                        // ATTENTION : peut poser probleme cf https://core.spip.net/issues/2505
44                {
45                        sql_alter("TABLE spip_referers DROP visites_veille,
46                        CHANGE visites_jour visites_veille INT(10) UNSIGNED NOT NULL DEFAULT '0',
47                        ADD visites_jour INT(10) UNSIGNED NOT NULL DEFAULT '0'");
48                }
49               
50               
51                spip_log("Popularite: purger referers_articles depuis $d");
52                if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) == 0) {
53                        spip_query("UPDATE spip_referers_articles SET visites_veille=visites_jour, visites_jour=0");
54                } else
55                        // version 3 fois plus rapide, mais en 2 requetes
56                        #spip_query("ALTER TABLE spip_referers CHANGE visites_jour visites_veille INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',CHANGE visites_veille visites_jour INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
57                        #spip_query("UPDATE spip_referers SET visites_jour=0");
58                        // version 4 fois plus rapide que la premiere, en une seule requete
59                        // ATTENTION : peut poser probleme cf https://core.spip.net/issues/2505
60                {
61                        sql_alter("TABLE spip_referers_articles DROP visites_veille,
62                        CHANGE visites_jour visites_veille INT(10) UNSIGNED NOT NULL DEFAULT '0',
63                        ADD visites_jour INT(10) UNSIGNED NOT NULL DEFAULT '0'");
64                }
65        }
66
67        // et c'est fini pour cette fois-ci
68        return 1;
69
70}
71
72// surcharge du cron de calcul des visites pour ajoute rles visites_jour et visites_veilles sur les spip_referers_articles
73
74function genie_visites($t) {
75       
76        include_spip('genie/visites'); // ?
77        //var_dump("hop");
78        //die();
79       
80        spip_log("lol genie visites stats data  " . date("Y-m-d H:i:s", $t) ,"test_genie_calculer_visites.4");
81
82        $encore = calculer_visites2($t);
83       
84        // Si ce n'est pas fini on redonne la meme date au fichier .lock
85        // pour etre prioritaire lors du cron suivant
86        if ($encore) {
87                return (0 - $t);
88        }
89       
90        // SPIP 3
91        // nettoyer les IP des floodeurs quand on a fini de compter les stats
92        if(function_exists('visites_nettoyer_flood'))
93                visites_nettoyer_flood();
94       
95        return 1;
96}
97
98/**
99 * Calcule les statistiques de visites sur le site et les articles et les liens entrants, en plusieurs étapes
100 *
101 * @uses compte_fichier_visite()
102 * @uses genie_popularite_constantes()
103 *
104 * @param int $t
105 *     Timestamp de la dernière exécution de cette tâche
106 * @return null|int
107 *     - null si aucune visite à prendre en compte ou si tous les fichiers de visite sont traités,
108 *     - entier négatif s'il reste encore des fichiers à traiter
109 **/
110function calculer_visites2($t) {
111        include_spip('base/abstract_sql');
112       
113        spip_log("Check des visites de " . date("Y-m-d H:i:s", $t) ,"test_genie_calculer_visites.4");
114       
115        // Initialisations
116        $visites = array(); # visites du site
117        $visites_a = array(); # tableau des visites des articles
118        $referers = array(); # referers du site
119        $referers_a = array(); # tableau des referers des articles
120
121        // charger un certain nombre de fichiers de visites,
122        // et faire les calculs correspondants
123
124        // Traiter jusqu'a 100 sessions datant d'au moins 30 minutes
125        $sessions = preg_files(sous_repertoire(_DIR_TMP, 'visites'));
126
127        $compteur = _CRON_LOT_FICHIERS_VISITE;
128        $date_init = time() - 30 * 60;
129       
130        foreach ($sessions as $item) {
131                if (($d = @filemtime($item)) < $date_init) {
132                        if (!$d) {
133                                $d = $date_init;
134                        } // si le fs ne donne pas de date, on prend celle du traitement, mais tout cela risque d'etre bien douteux
135                        $d = date("Y-m-d", $d);
136                        spip_log("traite la session $item");
137                        compte_fichier_visite($item,
138                                $visites[$d], $visites_a[$d], $referers[$d], $referers_a[$d]);
139                        spip_unlink($item);
140                        if (--$compteur <= 0) {
141                                break;
142                        }
143                }
144                #else spip_log("$item pas vieux");
145        }
146       
147        if (!count($visites)) {
148                return;
149        }
150
151        include_spip('genie/popularites');
152        list($a, $b) = genie_popularite_constantes(24 * 3600);
153
154        // Maintenant on dispose de plusieurs tableaux qu'il faut ventiler dans
155        // les tables spip_visites, spip_visites_articles, spip_referers
156        // et spip_referers_articles ; attention a affecter tout ca a la bonne
157        // date (celle de la visite, pas celle du traitement)
158        foreach (array_keys($visites) as $date) {
159                if ($visites[$date]) {
160                       
161                        // 1. les visites du site (facile)
162                        if (!sql_countsel('spip_visites', "date='$date'")) {
163                                sql_insertq('spip_visites',
164                                        array('date' => $date, 'visites' => $visites[$date]));
165                        } else {
166                                sql_update('spip_visites', array('visites' => "visites+" . intval($visites[$date])), "date='$date'");
167                        }
168
169                        // 2. les visites des articles
170                        if ($visites_a[$date]) {
171                                $ar = array();  # tableau num -> liste des articles ayant num visites
172                                foreach ($visites_a[$date] as $id_article => $n) {
173                                        if (!sql_countsel('spip_visites_articles',
174                                                "id_article=$id_article AND date='$date'")
175                                        ) {
176                                                sql_insertq('spip_visites_articles',
177                                                        array(
178                                                                'id_article' => $id_article,
179                                                                'visites' => 0,
180                                                                'date' => $date
181                                                        ));
182                                        }
183                                        $ar[$n][] = $id_article;
184                                }
185                                foreach ($ar as $n => $liste) {
186                                        $tous = sql_in('id_article', $liste);
187                                        sql_update('spip_visites_articles',
188                                                array('visites' => "visites+$n"),
189                                                "date='$date' AND $tous");
190
191                                        $ref = $noref = array();
192                                        foreach ($liste as $id) {
193                                                if (isset($referers_a[$id])) {
194                                                        $ref[] = $id;
195                                                } else {
196                                                        $noref[] = $id;
197                                                }
198                                        }
199                                        // il faudrait ponderer la popularite ajoutee ($n) par son anciennete eventuelle
200                                        // sur le modele de ce que fait genie/popularites
201                                        if (count($noref)) {
202                                                sql_update('spip_articles',
203                                                        array(
204                                                                'visites' => "visites+$n",
205                                                                'popularite' => "popularite+" . number_format(round($n * $b, 2), 2, '.', ''),
206                                                                'maj' => 'maj'
207                                                        ),
208                                                        sql_in('id_article', $noref));
209                                        }
210
211                                        if (count($ref)) {
212                                                sql_update('spip_articles',
213                                                        array(
214                                                                'visites' => "visites+" . ($n + 1),
215                                                                'popularite' => "popularite+" . number_format(round($n * $b, 2), 2, '.', ''),
216                                                                'maj' => 'maj'
217                                                        ),
218                                                        sql_in('id_article', $ref));
219                                        }
220
221                                        ## Ajouter un JOIN sur le statut de l'article ?
222                                }
223                        }
224                        if (!isset($GLOBALS['meta']['activer_referers']) or $GLOBALS['meta']['activer_referers'] == "oui") {
225                                // 3. Les referers du site
226                                // insertion pour les nouveaux, au tableau des increments sinon
227                                if ($referers[$date]) {
228                                        $ar = array();
229                                        $trouver_table = charger_fonction('trouver_table', 'base');
230                                        $desc = $trouver_table('referers');
231                                        $n = preg_match('/(\d+)/', $desc['field']['referer'], $r);
232                                        $n = $n ? $r[1] : 255;
233                                        foreach ($referers[$date] as $referer => $num) {
234                                                $referer_md5 = sql_hex(substr(md5($referer), 0, 15));
235                                                $referer = substr($referer, 0, $n);
236                                                if (!sql_countsel('spip_referers', "referer_md5=$referer_md5")) {
237                                                        sql_insertq('spip_referers',
238                                                                array(
239                                                                        'visites' => $num,
240                                                                        'visites_jour' => $num,
241                                                                        'visites_veille' => 0, // $num ??
242                                                                        'date' => $date,
243                                                                        'referer' => $referer,
244                                                                        'referer_md5' => $referer_md5
245                                                                ));
246                                                } else {
247                                                        $ar[$num][] = $referer_md5;
248                                                }
249                                        }
250
251                                        // appliquer les increments sur les anciens
252                                        // attention on appelle sql_in en mode texte et pas array
253                                        // pour ne pas passer sql_quote() sur les '0x1234' de referer_md5, cf #849
254                                        foreach ($ar as $num => $liste) {
255                                                sql_update('spip_referers', array('visites' => "visites+$num", 'visites_jour' => "visites_jour+$num"),
256                                                        sql_in('referer_md5', join(', ', $liste)));
257                                        }
258                                }
259
260                                // 4. Les referers d'articles
261                                if ($referers_a[$date]) {
262                                        $ar = array();
263                                        $insert = array();
264                                       
265                                        spip_log("nouveaux Ref art " . date("Y-m-d H:i:s", $t) ,"test_genie_calculer_visites.2");
266                                        spip_log($referers_a[$date]);
267                                       
268                                        // s'assurer d'un slot pour chacun
269                                        foreach ($referers_a[$date] as $id_article => $referers) {
270                                                foreach ($referers as $referer => $num) {
271                                                        $referer_md5 = sql_hex(substr(md5($referer), 0, 15));
272                                                        $prim = "(id_article=$id_article AND referer_md5=$referer_md5)";
273                                                        if (!sql_countsel('spip_referers_articles', $prim)) {
274                                                                sql_insertq('spip_referers_articles',
275                                                                        array(
276                                                                                'visites' => $num,
277                                                                                'id_article' => $id_article,
278                                                                                'referer' => $referer,
279                                                                                'referer_md5' => $referer_md5,
280                                                                                'visites_jour' => $num,
281                                                                                'visites_veille' => 0 // $num ?
282                                                                        ));
283                                                        } else {
284                                                                $ar[$num][] = $prim;
285                                                        }
286                                                }
287                                        }
288                                        // ajouter les visites
289                                        foreach ($ar as $num => $liste) {
290                                                sql_update('spip_referers_articles', array('visites' => "visites+$num", 'visites_jour' => "visites_jour+$num"), join(" OR ", $liste));
291                                        }
292                                }
293                        }
294                }
295        }
296
297        // S'il reste des fichiers a manger, le signaler pour reexecution rapide
298        if ($compteur == 0) {
299                spip_log("il reste des visites a traiter...");
300
301                return -$t;
302        }
303}
Note: See TracBrowser for help on using the repository browser.