Browse Source

Mauvais rangement.

spip-3.2
marcimat@rezo.net 5 years ago
commit
3827ecdb1a
  1. 144
      .gitattributes
  2. 381
      action/statistiques_archiver.php
  3. 41
      base/delete_referers.php
  4. 42
      base/delete_stats.php
  5. 109
      base/stats.php
  6. 420
      engines-list.txt
  7. 34
      exec/base_delete_referers.php
  8. 34
      exec/base_delete_stats.php
  9. 55
      formulaires/configurer_compteur.html
  10. 47
      formulaires/configurer_compteur.php
  11. 115
      genie/popularites.php
  12. 331
      genie/visites.php
  13. 181
      inc/referenceurs.php
  14. 81
      inc/statistiques.php
  15. 127
      inc/stats_referers_to_array.php
  16. 120
      inc/stats_visites_to_array.php
  17. 1428
      javascript/excanvas.js
  18. 3168
      javascript/jquery.flot.js
  19. 360
      javascript/jquery.flot.selection.js
  20. 432
      javascript/jquery.flot.time.js
  21. 736
      javascript/jquery.tflot.js
  22. 53
      lang/paquet-stats.xml
  23. 16
      lang/paquet-stats_ar.php
  24. 16
      lang/paquet-stats_de.php
  25. 16
      lang/paquet-stats_en.php
  26. 16
      lang/paquet-stats_es.php
  27. 16
      lang/paquet-stats_fa.php
  28. 14
      lang/paquet-stats_fr.php
  29. 16
      lang/paquet-stats_fr_fem.php
  30. 16
      lang/paquet-stats_fr_tu.php
  31. 16
      lang/paquet-stats_it.php
  32. 16
      lang/paquet-stats_lb.php
  33. 16
      lang/paquet-stats_nl.php
  34. 16
      lang/paquet-stats_oc_ni_mis.php
  35. 16
      lang/paquet-stats_pt.php
  36. 16
      lang/paquet-stats_pt_br.php
  37. 16
      lang/paquet-stats_ru.php
  38. 16
      lang/paquet-stats_sk.php
  39. 16
      lang/paquet-stats_uk.php
  40. 159
      lang/statistiques.xml
  41. 85
      lang/statistiques_ar.php
  42. 49
      lang/statistiques_ast.php
  43. 34
      lang/statistiques_ay.php
  44. 43
      lang/statistiques_bg.php
  45. 49
      lang/statistiques_br.php
  46. 46
      lang/statistiques_bs.php
  47. 49
      lang/statistiques_ca.php
  48. 50
      lang/statistiques_co.php
  49. 43
      lang/statistiques_cpf.php
  50. 46
      lang/statistiques_cpf_hat.php
  51. 46
      lang/statistiques_cs.php
  52. 43
      lang/statistiques_da.php
  53. 79
      lang/statistiques_de.php
  54. 34
      lang/statistiques_el.php
  55. 79
      lang/statistiques_en.php
  56. 42
      lang/statistiques_en_hx.php
  57. 48
      lang/statistiques_eo.php
  58. 78
      lang/statistiques_es.php
  59. 47
      lang/statistiques_eu.php
  60. 59
      lang/statistiques_fa.php
  61. 37
      lang/statistiques_fi.php
  62. 43
      lang/statistiques_fon.php
  63. 77
      lang/statistiques_fr.php
  64. 79
      lang/statistiques_fr_fem.php
  65. 79
      lang/statistiques_fr_tu.php
  66. 47
      lang/statistiques_gl.php
  67. 30
      lang/statistiques_hac.php
  68. 40
      lang/statistiques_he.php
  69. 46
      lang/statistiques_hu.php
  70. 48
      lang/statistiques_id.php
  71. 20
      lang/statistiques_is.php
  72. 84
      lang/statistiques_it.php
  73. 55
      lang/statistiques_it_fem.php
  74. 43
      lang/statistiques_ja.php
  75. 46
      lang/statistiques_km.php
  76. 59
      lang/statistiques_lb.php
  77. 43
      lang/statistiques_my.php
  78. 39
      lang/statistiques_nb.php
  79. 89
      lang/statistiques_nl.php
  80. 22
      lang/statistiques_no.php
  81. 47
      lang/statistiques_oc_auv.php
  82. 47
      lang/statistiques_oc_gsc.php
  83. 47
      lang/statistiques_oc_lms.php
  84. 47
      lang/statistiques_oc_lnc.php
  85. 50
      lang/statistiques_oc_ni.php
  86. 47
      lang/statistiques_oc_ni_la.php
  87. 79
      lang/statistiques_oc_ni_mis.php
  88. 47
      lang/statistiques_oc_prv.php
  89. 47
      lang/statistiques_oc_va.php
  90. 46
      lang/statistiques_pl.php
  91. 60
      lang/statistiques_pt.php
  92. 79
      lang/statistiques_pt_br.php
  93. 49
      lang/statistiques_ro.php
  94. 78
      lang/statistiques_ru.php
  95. 79
      lang/statistiques_sk.php
  96. 46
      lang/statistiques_sv.php
  97. 46
      lang/statistiques_tr.php
  98. 78
      lang/statistiques_uk.php
  99. 43
      lang/statistiques_vi.php
  100. 48
      lang/statistiques_zh.php
  101. Some files were not shown because too many files have changed in this diff Show More

144
.gitattributes vendored

@ -0,0 +1,144 @@
* text=auto !eol
action/statistiques_archiver.php -text
base/delete_referers.php -text
base/delete_stats.php -text
base/stats.php -text
/engines-list.txt -text
exec/base_delete_referers.php -text
exec/base_delete_stats.php -text
formulaires/configurer_compteur.html -text
formulaires/configurer_compteur.php -text
genie/popularites.php -text
genie/visites.php -text
inc/referenceurs.php -text
inc/statistiques.php -text
inc/stats_referers_to_array.php -text
inc/stats_visites_to_array.php -text
javascript/excanvas.js -text
javascript/jquery.flot.js -text
javascript/jquery.flot.selection.js -text
javascript/jquery.flot.time.js -text
javascript/jquery.tflot.js -text
lang/paquet-stats.xml -text
lang/paquet-stats_de.php -text
lang/paquet-stats_es.php -text
lang/paquet-stats_fa.php -text
lang/paquet-stats_fr_fem.php -text
lang/paquet-stats_fr_tu.php -text
lang/paquet-stats_it.php -text
lang/paquet-stats_lb.php -text
lang/paquet-stats_nl.php -text
lang/paquet-stats_oc_ni_mis.php -text
lang/paquet-stats_pt.php -text
lang/paquet-stats_pt_br.php -text
lang/paquet-stats_ru.php -text
lang/paquet-stats_sk.php -text
lang/paquet-stats_uk.php -text
lang/statistiques.xml -text
lang/statistiques_ar.php -text
lang/statistiques_ast.php -text
lang/statistiques_ay.php -text
lang/statistiques_bg.php -text
lang/statistiques_br.php -text
lang/statistiques_bs.php -text
lang/statistiques_ca.php -text
lang/statistiques_co.php -text
lang/statistiques_cpf.php -text
lang/statistiques_cpf_hat.php -text
lang/statistiques_cs.php -text
lang/statistiques_da.php -text
lang/statistiques_de.php -text
lang/statistiques_el.php -text
lang/statistiques_en.php -text
lang/statistiques_en_hx.php -text
lang/statistiques_eo.php -text
lang/statistiques_es.php -text
lang/statistiques_eu.php -text
lang/statistiques_fa.php -text
lang/statistiques_fi.php -text
lang/statistiques_fon.php -text
lang/statistiques_fr.php -text
lang/statistiques_fr_fem.php -text
lang/statistiques_fr_tu.php -text
lang/statistiques_gl.php -text
lang/statistiques_hac.php -text
lang/statistiques_he.php -text
lang/statistiques_hu.php -text
lang/statistiques_id.php -text
lang/statistiques_is.php -text
lang/statistiques_it.php -text
lang/statistiques_it_fem.php -text
lang/statistiques_ja.php -text
lang/statistiques_km.php -text
lang/statistiques_lb.php -text
lang/statistiques_my.php -text
lang/statistiques_nb.php -text
lang/statistiques_nl.php -text
lang/statistiques_no.php -text
lang/statistiques_oc_auv.php -text
lang/statistiques_oc_gsc.php -text
lang/statistiques_oc_lms.php -text
lang/statistiques_oc_lnc.php -text
lang/statistiques_oc_ni.php -text
lang/statistiques_oc_ni_la.php -text
lang/statistiques_oc_ni_mis.php -text
lang/statistiques_oc_prv.php -text
lang/statistiques_oc_va.php -text
lang/statistiques_pl.php -text
lang/statistiques_pt.php -text
lang/statistiques_pt_br.php -text
lang/statistiques_ro.php -text
lang/statistiques_ru.php -text
lang/statistiques_sk.php -text
lang/statistiques_sv.php -text
lang/statistiques_tr.php -text
lang/statistiques_uk.php -text
lang/statistiques_vi.php -text
lang/statistiques_zh.php -text
prive/bouton/statistiques.html -text
prive/squelettes/contenu/stats_archiver.html -text
prive/squelettes/contenu/stats_lang.html -text
prive/squelettes/contenu/stats_lang_fonctions.php -text
prive/squelettes/contenu/stats_referers.html -text
prive/squelettes/contenu/stats_referers_fonctions.php -text
prive/squelettes/contenu/stats_repartition.html -text
prive/squelettes/contenu/stats_repartition_fonctions.php -text
prive/squelettes/contenu/stats_visites.html -text
prive/squelettes/inclure/admin_effacer_stats.html -text
prive/squelettes/inclure/admin_stats_archiver.html -text
prive/squelettes/inclure/stats-visites-data.html -text
prive/squelettes/inclure/stats-visites-data_fonctions.php -text
prive/squelettes/inclure/stats-visites-jours.html -text
prive/squelettes/inclure/stats-visites-jours_fonctions.php -text
prive/squelettes/inclure/stats-visites-mois.html -text
prive/squelettes/inclure/stats-visites-mois_fonctions.php -text
prive/squelettes/inclure/stats-visites-populaires.html -text
prive/squelettes/navigation/stats_archiver.html -text
prive/squelettes/top/stats_lang.html -text
prive/squelettes/top/stats_referers.html -text
prive/squelettes/top/stats_repartition.html -text
prive/squelettes/top/stats_visites.html -text
prive/stats/visites.html -text
prive/style_prive_plugin_stats.html -text
prive/themes/spip/images/licence.txt -text
prive/themes/spip/images/referers-16.png -text
prive/themes/spip/images/referers-24.png -text
prive/themes/spip/images/referers-32.png -text
prive/themes/spip/images/repartition-16.png -text
prive/themes/spip/images/repartition-24.png -text
prive/themes/spip/images/repartition-32.png -text
prive/themes/spip/images/statistique-16.png -text
prive/themes/spip/images/statistique-24.png -text
prive/themes/spip/images/statistique-32.png -text
prive/themes/spip/images/zoomin-16.png -text
prive/themes/spip/images/zoomin-24.png -text
prive/themes/spip/images/zoomin-32.png -text
prive/themes/spip/images/zoomout-16.png -text
prive/themes/spip/images/zoomout-24.png -text
prive/themes/spip/images/zoomout-32.png -text
prive/transmettre/statistiques.html -text
public/stats.php -text
/stats_administrations.php -text
/stats_autoriser.php -text
/stats_ieconfig.php -text
/stats_pipelines.php -text

381
action/statistiques_archiver.php

@ -0,0 +1,381 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* 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. *
\***************************************************************************/
/**
* Action d'archivage des statistiques
*
* @plugin Statistiques pour SPIP
* @license GNU/GPL
* @package SPIP\Stats\Actions
**/
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
if (!defined('STATISTIQUES_ARCHIVER_PAR_MOIS')) {
/**
* Nombre d'années après quoi on permet de concaténer les statistiques de visites par mois
*
* Après ce nombre d'années, on peut concaténer les données de visites d'articles par mois
* pour prendre moins de place dans la base de données
*
* @var int Nombre d'années
**/
define('STATISTIQUES_ARCHIVER_PAR_MOIS', 2);
}
if (!defined('STATISTIQUES_ARCHIVER_PAR_AN')) {
/**
* Nombre d'années après quoi on permet de concaténer les statistiques de visites par an
*
* Après ce nombre d'années, on peut concaténer les données de visites d'articles par années
* pour prendre moins de place dans la base de données
*
* @var int Nombre d'années
**/
define('STATISTIQUES_ARCHIVER_PAR_AN', 5);
}
/**
* Archiver ou nettoyer des statistiques
*
* @param string $arg
*/
function action_statistiques_archiver_dist($arg = null) {
if (!$arg) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
if (!autoriser('webmestre')) {
include_spip('inc/minipres');
minipres();
}
if (!in_array($arg, array(
'archiver_visites_articles',
'nettoyer_visites_articles',
'nettoyer_referers_articles'
))
) {
include_spip('inc/minipres');
minipres("Argument non compris");
}
$func = 'statistiques_' . $arg;
$func();
}
/**
* Logguer ces informations importantes.
*
* @uses spip_log()
* @param string $texte
**/
function statistiques_archiver_log($texte) {
spip_log($texte, 'statistiques_archiver.' . _LOG_INFO_IMPORTANTE);
}
/**
* Nettoyer des lignes de visites d'articles incorrectes
*
* Supprime toutes les lignes qui ne font pas partie
* d'un article présent en base
**/
function statistiques_nettoyer_visites_articles() {
statistiques_archiver_log("Supprimer les visites d'articles qui n'existent pas dans spip_articles.");
$i = sql_delete('spip_visites_articles', 'id_article NOT IN (SELECT id_article FROM spip_articles)');
statistiques_archiver_log("Fin de la suppression : $i lignes supprimées");
}
/**
* Nettoyer des lignes de referers d'articles incorrectes
*
* Supprime toutes les lignes qui ne font pas partie
* d'un article présent en base
**/
function statistiques_nettoyer_referers_articles() {
statistiques_archiver_log("Supprimer les referers d'articles qui n'existent pas dans spip_articles.");
$i = sql_delete('spip_referers_articles', 'id_article NOT IN (SELECT id_article FROM spip_articles)');
statistiques_archiver_log("Fin de la suppression : $i lignes supprimées");
}
/**
* Archiver les visites d'articles
*
* @note
* Cela peut prendre beaucoup de temps.
*
* La base de test avait (en 2014) 12.500.000 d'entrées depuis 2005.
* Cet archivage réduit à 1.200.000 entrées en réduisant
* par mois jusqu'à 2012 inclu et par an jusqu'à 2009 inclu.
*
* Cela prenait 8 minutes sur ma machine locale
* (Intel Core i5-4258U CPU @ 2.40GHz × 4 avec disque SSD)
*
* @note
* On peut suivre l'avancement dans le fichier de log
* tail -f tmp/log/statistiques_archiver.log
*
* @note
* On ne peut pas vraiment avec le code actuel de la fonction
* appliquer les calculs sur l'ensemble d'un mois car cela
* peut facilement surcharger la mémoire de php.
*
* Du coup, on applique par petit bouts d'abord.
*
* @uses statistiques_concatener_visites_entre_jours()
* @uses statistiques_concatener_visites_par_mois()
* @uses statistiques_concatener_visites_par_an()
**/
function statistiques_archiver_visites_articles() {
// Tenter de donner du temps au temps
@set_time_limit(15 * 60); // 15mn
$annee_par_mois = date('Y') - STATISTIQUES_ARCHIVER_PAR_MOIS;
$annee_par_an = date('Y') - STATISTIQUES_ARCHIVER_PAR_AN;
$annee_minimum = statistiques_concatener_annee_minimum();
if (!$annee_minimum) {
return false;
}
if ($annee_minimum > $annee_par_mois) {
statistiques_archiver_log("Il n'y a pas de statistiques assez anciennes pour concaténer par mois !");
} else {
// en plusieurs temps pour éviter trop de mémoire !
statistiques_concatener_visites_entre_jours($annee_par_mois, 1, 10);
statistiques_concatener_visites_entre_jours($annee_par_mois, 11, 20);
statistiques_concatener_visites_entre_jours($annee_par_mois, 21, 31);
// et on regroupe tout en 1 seul morceau.
statistiques_concatener_visites_par_mois($annee_par_mois);
}
if ($annee_minimum > $annee_par_an) {
statistiques_archiver_log("Il n'y a pas de statistiques assez anciennes pour concaténer par an !");
} else {
// et les vieilles années, on regroupe par an directement.
statistiques_concatener_visites_par_an($annee_par_an);
}
statistiques_archiver_log("* Optimiser la table spip_visites_articles après les travaux.");
sql_optimize('spip_visites_articles');
}
/**
* Concatène les statistiques de visites d'articles par mois
*
* @see statistiques_concatener_visites_entre_jours()
*
* @param int $annee
* On concatène ce qui est avant cette année là.
**/
function statistiques_concatener_visites_par_mois($annee) {
return statistiques_concatener_visites_entre_jours($annee, 1, 31);
}
/**
* Concatène les statistiques de visites d'articles par portion de mois (entre groupe de jours)
*
* @param int $annee
* On concatène ce qui est avant cette année là.
* @param int $debut
* Numéro de jour du début de la concaténation, exemple 1.
* Le total des visites concaténé sera mis dans ce jour là.
* @param int $fin
* Numéro de jour de fin de la concaténation, exemple 31.
* Toutes les entrées entre le jour $debut+1 et $fin seront supprimées
* et concaténées au jour $debut.
*
**/
function statistiques_concatener_visites_entre_jours($annee, $debut, $fin) {
$annee_minimum = statistiques_concatener_annee_minimum();
if (!$annee_minimum) {
return false;
}
if ($annee_minimum > $annee) {
statistiques_archiver_log("Il n'y a pas de statistiques assez anciennes !");
return false;
}
// on a besoin pour le champ date d'une écriture sur 2 chiffres.
$debut = str_pad($debut, 2, '0', STR_PAD_LEFT);
$fin = str_pad($fin, 2, '0', STR_PAD_LEFT);
statistiques_archiver_log("\nConcaténer les visites d'articles (jours entre $debut et $fin)");
statistiques_archiver_log("===========================================================");
$annees = range($annee_minimum, $annee);
$mois = range(1, 12);
foreach ($annees as $a) {
statistiques_archiver_log("\n- Concaténer les visites de l'année : $a");
foreach ($mois as $m) {
$m = str_pad($m, 2, '0', STR_PAD_LEFT);
statistiques_concatener_visites_entre_periode("$a-$m-$debut", "$a-$m-$fin");
}
}
}
/**
* Retourne la plus petite année des visites d'articles
*
* @return int|bool
* - int : l'année
* - false : année non trouvée.
**/
function statistiques_concatener_annee_minimum() {
static $annee_minimum = null;
// calcul de la plus petite année de statistiques
if (is_null($annee_minimum)) {
$annee_minimum = sql_getfetsel('YEAR(MIN(date))', 'spip_visites_articles', '', '', '', '0,1');
}
if (!$annee_minimum) {
statistiques_archiver_log("Erreur de calcul de la plus petite année de statistiques !");
return false;
}
return $annee_minimum;
}
/**
* Concatène les statistiques de visites d'articles par an
*
* @param int $annee
* On concatène ce qui est avant cette année là.
*
**/
function statistiques_concatener_visites_par_an($annee) {
$annee_minimum = statistiques_concatener_annee_minimum();
if (!$annee_minimum) {
return false;
}
if ($annee_minimum > $annee) {
statistiques_archiver_log("Il n'y a pas de statistiques assez anciennes !");
return false;
}
statistiques_archiver_log("\nConcaténer les visites d'articles (par an)");
statistiques_archiver_log("===========================================================");
$annees = range($annee_minimum, $annee);
foreach ($annees as $a) {
statistiques_archiver_log("\n- Concaténer les visites de l'année : $a");
statistiques_concatener_visites_entre_periode("$a-01-01", "$a-12-31");
}
}
/**
* Concatène les statistiques de visites d'articles entre 2 périodes.
*
* @param string $date_debut
* Date de début tel que '2010-01-01'
* @param string $date_fin
* Date de fin tel que '2010-12-31'
* @return bool
* - false : aucune visite sur cette période
* - true : il y avait des visites, elles ont été concaténées (ou l'étaient déjà)
*
**/
function statistiques_concatener_visites_entre_periode($date_debut, $date_fin) {
// récupérer toutes les visites de cette période (année, mois, entre jour début et fin)
$visites = sql_allfetsel('id_article, date, visites', 'spip_visites_articles', array(
"date >= " . sql_quote($date_debut),
"date <= " . sql_quote($date_fin),
));
if (!$visites) {
return false;
}
$liste = $updates = array();
$total = 0;
// - Crée un tableau plus simple (id_article => total des visites de la période) (permettant un array_diff_key facile).
// - Calcule au passage le total des visites de la période (pour le log)
// - Rempli un autre tableau ($updates) qui indique si cet article doit avoir ses visites concaténées sur cette période,
// c'est à dire, si il y a une date qui n'est pas le début de période.
// (évite de nombreuses requêtes si l'on exécute plusieurs fois le script)
foreach ($visites as $v) {
$id_article = $v['id_article'];
if (!isset($liste[$id_article])) {
$liste[$id_article] = 0;
}
$liste[$id_article] += $v['visites'];
$total += $v['visites'];
if ($v['date'] != $date_debut) {
$updates[$id_article] = true;
}
}
unset($visites);
$nb_articles = count($liste);
// juste ceux qui nécessitent une mise à jour (date <> de $debut de période)
$liste = array_intersect_key($liste, $updates);
statistiques_archiver_log("-- du $date_debut au $date_fin : $total visites dans $nb_articles articles");
if ($liste) {
// formater pour l'insertion dans la base.
$inserts = array();
foreach ($liste as $id_article => $visites) {
$inserts[] = array(
'id_article' => $id_article,
'date' => $date_debut,
'visites' => $visites,
);
}
statistiques_archiver_log("--- concaténer les statistiques de " . count($liste) . " articles");
// /!\ Attention,
// Entre ces 2 requêtes, on peut perdre des données (si timeout ou autre)
// Transaction à faire ?
sql_delete('spip_visites_articles', array(
"date >= " . sql_quote($date_debut),
"date <= " . sql_quote($date_fin),
sql_in('id_article', array_keys($liste)),
));
sql_insertq_multi('spip_visites_articles', $inserts);
}
unset($liste, $inserts);
return true;
}

41
base/delete_referers.php

@ -0,0 +1,41 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* 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;
} // securiser
// faudrait plutot recuperer dans inc_serialbase et inc_auxbase
// mais il faudra prevenir ceux qui affectent les globales qui s'y trouvent
// Afficher la liste de ce qu'on va detruire et demander confirmation
// ca vaudrait mieux
/**
* Supprimer les referers
*
* @param strinf $titre
* @param bool $reprise
* @return string
*/
function base_delete_referers_dist($titre = '', $reprise = '') {
if (!$titre) {
return;
} // anti-testeur automatique
sql_delete("spip_referers");
sql_delete("spip_referers_articles");
sql_update("spip_articles", array('referers' => 0));
// un pipeline pour detruire les tables de referers installees par les plugins ?
//pipeline('delete_referers', '');
spip_log("raz des referers operee redirige vers " . _request('redirect'));
}

42
base/delete_stats.php

@ -0,0 +1,42 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* 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;
} // securiser
// faudrait plutot recuperer dans inc_serialbase et inc_auxbase
// mais il faudra prevenir ceux qui affectent les globales qui s'y trouvent
// Afficher la liste de ce qu'on va detruire et demander confirmation
// ca vaudrait mieux
/**
* Supprimer les stats
*
* @param strinf $titre
* @param bool $reprise
* @return string
*/
function base_delete_stats_dist($titre = '', $reprise = '') {
if (!$titre) {
return;
} // anti-testeur automatique
sql_delete("spip_visites");
sql_delete("spip_visites_articles");
sql_delete("spip_referers");
sql_delete("spip_referers_articles");
sql_update("spip_articles", array('visites' => 0, 'referers' => 0, 'popularite' => 0));
// un pipeline pour detruire les tables de stats installees par les plugins
pipeline('delete_statistiques', '');
spip_log("raz des stats operee redirige vers " . _request('redirect'));
}

109
base/stats.php

@ -0,0 +1,109 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* 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. *
\***************************************************************************/
/**
* Déclarations relatives à la base de données
*
* @plugin Statistiques pour SPIP
* @license GNU/GPL
* @package SPIP\Stats\Pipelines
**/
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
/**
* Déclarer les tables de statistiques
*
* Déclare les tables :
* - spip_visites
* - spip_visites_articles
* - spip_referers
* - spip_referers_articles
*
* @pipeline declarer_tables_auxiliaires
* @param array $tables_auxiliaires
* Description des tables auxiliaires
* @return array
* Description complétée des tables auxiliaires
*/
function stats_declarer_tables_auxiliaires($tables_auxiliaires) {
$spip_visites = array(
"date" => "DATE NOT NULL",
"visites" => "int UNSIGNED DEFAULT '0' NOT NULL",
"maj" => "TIMESTAMP"
);
$spip_visites_key = array(
"PRIMARY KEY" => "date"
);
$spip_visites_articles = array(
"date" => "DATE NOT NULL",
"id_article" => "int UNSIGNED NOT NULL",
"visites" => "int UNSIGNED DEFAULT '0' NOT NULL",
"maj" => "TIMESTAMP"
);
$spip_visites_articles_key = array(
"PRIMARY KEY" => "date, id_article"
);
$spip_referers = array(
"referer_md5" => "bigint UNSIGNED NOT NULL",
"date" => "DATE NOT NULL",
"referer" => "VARCHAR (255)",
"visites" => "int UNSIGNED NOT NULL",
"visites_jour" => "int UNSIGNED NOT NULL",
"visites_veille" => "int UNSIGNED NOT NULL",
"maj" => "TIMESTAMP"
);
$spip_referers_key = array(
"PRIMARY KEY" => "referer_md5"
);
$spip_referers_articles = array(
"id_article" => "int UNSIGNED NOT NULL",
"referer_md5" => "bigint UNSIGNED NOT NULL",
"referer" => "VARCHAR (255) DEFAULT '' NOT NULL",
"visites" => "int UNSIGNED NOT NULL",
"maj" => "TIMESTAMP"
);
$spip_referers_articles_key = array(
"PRIMARY KEY" => "id_article, referer_md5",
"KEY referer_md5" => "referer_md5"
);
$tables_auxiliaires['spip_visites'] = array(
'field' => &$spip_visites,
'key' => &$spip_visites_key
);
$tables_auxiliaires['spip_visites_articles'] = array(
'field' => &$spip_visites_articles,
'key' => &$spip_visites_articles_key
);
$tables_auxiliaires['spip_referers'] = array(
'field' => &$spip_referers,
'key' => &$spip_referers_key
);
$tables_auxiliaires['spip_referers_articles'] = array(
'field' => &$spip_referers_articles,
'key' => &$spip_referers_articles_key
);
return $tables_auxiliaires;
}

420
engines-list.txt

@ -0,0 +1,420 @@
# -----------------------------------------------------------------------------
# Les Visiteurs - Engines List
# -----------------------------------------------------------------------------
# [Engine Name]
# word= | word => query | directory
# host 1
# host 2
# hots ...
# -----------------------------------------------------------------------------
# sort the list according your visits (see your referrers).
# -----------------------------------------------------------------------------
[IP]
rien=
[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
# -----------------------------------------------------------------------------
# Services de mail
# -----------------------------------------------------------------------------
[(email)]
rien=
imp(.*)\.free\.fr
fc\.kayenta\.com
courrielweb\.cmaisonneuve\.qc\.ca
(.*)mail\.(.*)\.([a-z]+)$
webmail([0-9]*)\.wanadoo\.fr
www\.laposte\.net
mail([0-9]*)\.voila\.fr
\/(web)?mail\/
# -----------------------------------------------------------------------------
# Les moteurs vivants - Engines List
# -----------------------------------------------------------------------------
[Accentice]
q=
(.*\.|)accentice\.com
[Alice]
qs=
\.aliceadsl\.
[alOt]
q=
search\.alot\.com
[AOLsearch]
(query|q)=
(.*)search\.aol\.(.*)
[AOL France]
(query|q|r)=
(.*)recherchet?\.aol\.fr
[Ask]
(q|queryTerm|searchfor)=
(.*)\.ask\.com
[Babylon]
q=
search\.babylon\.com
[Baidu]
(wd|d)=
(.*\.|)baidu\.com
[Bing]
q=
(.*)\.bing\.com
bing\.com
search\.live\.com
[BlueWin]
query=
search\.bluewin\.ch
[Copernic]
query=
find\.copernic\.com
[Crawler]
q=
(www\.)crawler\.com
[Delicious]
p=
delicious\.com
[Delta Search]
q=
(.*\.|)delta-search\.com
[EO]
q=
www\.eo\.st
[Dogpile]
query=
(.*)dogpile\.com
[Dogpile]
q=
(.*\.|)dogpile\.co\.uk
[EasySearch]
s=
(.*\.|)easysearch\.org\.uk
[Ecosia]
q=
(.*\.|)ecosia\.org
[Exalead]
q=
www\.exalead\.fr
www\.exalead\.com
[Excite]
search=
www\.excite\.fr
(.*)\.excite\.co\.jp
[Facemoods]
s=
start\.facemoods\.com
[FoxRef]
key=
www\.foxref\.org
[francesurf]
q=
www\.francesurf\.net
[Francite]
name=
recherche\.francite\.com
[Free]
q=
search(.*)\.free\.fr
[Freeserve]
q=
search\.freeserve\.com
[Google]
(^q|\&q|as_q|qs)=
(www\.|ww\.|maps\.)?(google|gogole)\.(.*)
(web|www).toile.com
www\.cegetel\.net
search\.conduit\.com
search\.sweetim\.com
chello\.fr
isearch\.avg\.com
[Govome]
q=
(.*\.|)govome\.com
[Globososo]
q=
(.*\.|)globososo\.com
[so]
q=
www\.so\.com
[HolaSearch]
q=
(.*\.|)holasearch\.com
[HelloSearch]
q=
(.*\.|)hellosearch\.fr
[HooSeek]
recherche=
(www\.)?hooseek\.com
[HotBot]
query=
www\.hotbot\.com
[Iadah]
q=
(www\.|)iadah\.com
[Incredibar]
q=
(search\.)incredibar\.com
[ixquick]
query=
ixquick\.com
[LemmeFind]
t=
www\.lemmefind\.fr
[Libero.it]
query=
arianna\.libero\.it
[Lilo]
q=
(.*\.|)(uselilo|search\.lilo)\.org
[Lost]
x_query=
(www\.)?lo\.st
[Lycos]
query=
search\.lycos\.com
vachercher\.lycos\.fr
[Metacrawler]
query=
metacrawler\.com
[Mirago]
qry=
www.mirago\.([a-z]+)$
[MonGenie]
Keywords=
www\.mongenie\.com
[MozBot]
q=
www\.mozbot\.([a-z]+)$
[moteur-recherche.net]
keyword=
www\.moteur-recherche\.net
[MSN]
(q|s)=
search(.*)\.msn\.([a-z.]+)$
leguide(.*)\.msn\.([a-z]+)$
(.*)\.msn\.([a-z]+)$
search\.ninemsn\.com\.au
[mySearchDial]
q=
(.*\.|)mysearchdial\.com
[MyWay]
searchfor=
(.*)\.myway\.com
www\.mywebsearch\.com
(.*)\.mysearch\.com
[MyWebSearch]
searchfor=
search\.mywebsearch\.com
[Naver]
query=
search\.naver\.com
[Need2Find]
searchfor=
kx\.search\.need2find\.com
[Nomade]
s=
(.*)\.nomade\.fr
(.*)\.nomade\.tiscali\.fr
(.*)\.nomade\.aliceadsl\.fr
[NovoNeo]
q=
www\.novoneo\.com
[Orange, le moteur]
rdata=
www\.lemoteur\.fr
[Orange, le moteur]
kw=
lemoteur\.orange\.fr
[ParallaxSearch]
qs=
(.*\.|)parallaxsearch\.com
[Pesquisa]
q=
pesquisa\.sapo\.pt
[Qone8]
q=
(.*\.|)qone8\.com
[Qwant]
q=
(.*\.|)qwant\.com
[Search-Results]
q=
(.*\.|)search-results\.com
[Searchqu]
q=
(www\.)searchqu\.com
[SearchYa]
q=
(www\.|)searchya\.com
[Seek]
qry_str=
\.seek\.fr
[Seznam]
q=
(.*\.|)seznam\.cz
[Skeech]
query=
skeech\.com
[Sogou]
query=
www\.sogou\.com
[Sympatico]
query=
search\.sli\.sympatico\.ca
[Trouver]
q=
(.*\.|)trouver\.fr
[Vi-View]
q=
(.*\.|)vi-view\.com
[Virgilio.it]
qs=
search\.virgilio\.it
[Yahoo!]
p=
(.*)(m|search|ink|dir|google)\.yahoo\.([a-z]+)$
[Yandex]
text=
(www\.)?yandex\.ru
[Wow]
q=
(.*\.|)wow\.com
[Xeoo]
k=
(www\.)?xeoo\.com
# -----------------------------------------------------------------------------
# Les moteurs morts - Engines List
# -----------------------------------------------------------------------------
[9online]
query=
www\.9online\.fr
[AltaVista]
q=
(.*)altavista\.com
[AllTheWeb]
q=
www\.alltheweb\.com
[Cegetel]
q=
(www\.)?cegetel\.([a-z]+)$
[Club Internet]
q=
recherche\.club-internet\.fr
[dmoz.org]
rien=
(.*\.)?dmoz\.org
[Haosou]
q=
www\.haosou\.com
[n9uf]
((K|k)eywords|query)=
(www\.)?neuf\.fr
[Netscape]
search=
search-intl\.netscape\.com
search\.netscape\.com
www\.netscape\.fr
[OneBigWorld]
Keywords=
fr\.onebigworld\.com
[Overture]
Keywords=
www\.overture\.com
[Reacteur.com]
kw=
www\.reacteur\.com
[Voila]
(kw|rdata)=
(search|moteur)(.*)\.voila\.(fr|com)

34
exec/base_delete_referers.php

@ -0,0 +1,34 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* 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;
}
function exec_base_delete_referers_dist() {
include_spip('inc/autoriser');
if (!autoriser('detruire', '_statistiques')) {
include_spip('inc/minipres');
echo minipres();
} else {
include_spip('inc/headers');
$admin = charger_fonction('admin', 'inc');
$res = $admin('delete_referers', _T('statistiques:bouton_effacer_referers'), '');
if ($res) {
echo $res;
} else {
redirige_url_ecrire('stats_referers', '');
}
}
}

34
exec/base_delete_stats.php

@ -0,0 +1,34 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* 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;
}
function exec_base_delete_stats_dist() {
include_spip('inc/autoriser');
if (!autoriser('detruire', '_statistiques')) {
include_spip('inc/minipres');
echo minipres();
} else {
include_spip('inc/headers');
$admin = charger_fonction('admin', 'inc');
$res = $admin('delete_stats', _T('statistiques:bouton_effacer_statistiques'), '');
if ($res) {
echo $res;
} else {
redirige_url_ecrire('stats_visites', '');
}
}
}

55
formulaires/configurer_compteur.html

@ -0,0 +1,55 @@
<div class='formulaire_spip formulaire_configurer formulaire_configurer_compteur' id='formulaire_configurer_compteur'>
<h3 class='titrem'>[(#CHEMIN_IMAGE{statistique-24.png}|balise_img{'',cadre-icone})]<:statistiques:info_forum_statistiques:> #AIDER{confstat}</h3>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form action="#ENV{action}#formulaire_configurer_compteur" method="post"><div>
#ACTION_FORMULAIRE
<div class="editer-groupe">
<div class='editer configurer_activer_statistiques[ (#ENV**{erreurs}|table_valeur{activer_statistiques}|oui)erreur]'>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{activer_statistiques})</span>]
<div class='choix'>
<input class='checkbox' type="checkbox" name="activer_statistiques" value='oui' [checked="(#ENV{activer_statistiques}|=={oui}|?{checked})"] id="activer_statistiques"/>
<label for="activer_statistiques"><:statistiques:item_gerer_statistiques:></label>
</div>
</div>
<div class='editer configurer_activer_referers[ (#ENV**{erreurs}|table_valeur{activer_referers}|oui)erreur]'>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{activer_referers})</span>]
<div class='choix'>
<input class='checkbox' type="checkbox" name="activer_referers" value='oui' [checked="(#ENV{activer_referers, oui}|=={oui}|?{checked})"] id="activer_referers"/>
<label for="activer_referers"><:statistiques:info_referer_oui:></label>
</div>
</div>
<div class='editer configurer_activer_captures_referers[ (#ENV**{erreurs}|table_valeur{activer_captures_referers}|oui)erreur]'>
<div class='explication'><:statistiques:info_question_vignettes_referer:></div>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{activer_captures_referers})</span>]
<div class='choix'>
<input class='checkbox' type="checkbox" name="activer_captures_referers" value='oui' [checked="(#ENV{activer_captures_referers}|=={oui}|?{checked})"] id="activer_captures_referers"/>
<label for="activer_captures_referers"><:statistiques:info_question_vignettes_referer_oui:></label>
</div>
</div>
</div>
<p class='boutons'><input class='submit' type="submit" name="ok" value="<:bouton_enregistrer:>"/></p>
</div></form>
</div>
<script type='text/javascript'>
function actualise_referers(){
if (jQuery('#activer_statistiques').prop('checked')) {
jQuery('#formulaire_configurer_compteur .editer.configurer_activer_captures_referers').show();
if (jQuery('#activer_referers').prop('checked')) {
jQuery('#formulaire_configurer_compteur .editer.configurer_activer_referers').show();
} else {
jQuery('#formulaire_configurer_compteur .editer.configurer_activer_captures_referers').hide();
}
} else {
jQuery('#formulaire_configurer_compteur .editer.configurer_activer_captures_referers').hide();
jQuery('#formulaire_configurer_compteur .editer.configurer_activer_referers').hide();
}
}
jQuery(function($){
$('#activer_statistiques, #activer_referers').on('change', actualise_referers);
actualise_referers();
});
</script>

47
formulaires/configurer_compteur.php

@ -0,0 +1,47 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* 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;
}
function formulaires_configurer_compteur_charger_dist() {
$valeurs = array();
$valeurs['activer_statistiques'] = $GLOBALS['meta']['activer_statistiques'];
$valeurs['activer_referers'] = $GLOBALS['meta']['activer_referers'];
$valeurs['activer_captures_referers'] = $GLOBALS['meta']['activer_captures_referers'];
return $valeurs;
}
function formulaires_configurer_compteur_verifier_dist() {
$erreurs = array();
// les checkbox
foreach (array('activer_statistiques', 'activer_referers', 'activer_captures_referers') as $champ) {
if (_request($champ) != 'oui') {
set_request($champ, 'non');
}
}
return $erreurs;
}
function formulaires_configurer_compteur_traiter_dist() {
include_spip('inc/config');
appliquer_modifs_config();
return array('message_ok' => _T('config_info_enregistree'));
}

115
genie/popularites.php

@ -0,0 +1,115 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* 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. *
\***************************************************************************/
/**
* Gestion du calcul des popularités (cron)
*
* @plugin Statistiques pour SPIP
* @license GNU/GPL
* @package SPIP\Statistiques\Genie
**/
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
/**
* Calcule des coefficients de popularité en fonction de l'intervalle
* écoulé depuis le précédent calcul
*
* Popularite, modele logarithmique
*
* @param int $duree Intervalle écoulé depuis le précédent calcul
* @return array {
* @type float $a Coefficient d'amortissement
* @type float $b Constante multiplicative
* }
**/
function genie_popularite_constantes($duree) {
// duree de demi-vie d'une visite dans le calcul de la popularite (en jours)
$demivie = 0.5;
// periode de reference en jours
$periode = 1;
// $a est le coefficient d'amortissement depuis la derniere mesure
$a = pow(2, -$duree / ($demivie * 24 * 3600));
// $b est la constante multiplicative permettant d'avoir
// une visite par jour (periode de reference) = un point de popularite
// (en regime stationnaire)
// or, magie des maths, ca vaut log(2) * duree journee/demi-vie
// si la demi-vie n'est pas trop proche de la seconde ;)
$b = log(2) * $periode / $demivie;
return array($a, $b);
}
/**
* Cron de calcul des popularités des articles
*
* @uses genie_popularite_constantes()
*
* @param int $t
* Timestamp de la dernière exécution de cette tâche
* @return int
* Positif si la tâche a été terminée, négatif pour réexécuter cette tâche
**/
function genie_popularites_dist($t) {
// Si c'est le premier appel, ne pas calculer
$t = $GLOBALS['meta']['date_popularites'];
ecrire_meta('date_popularites', time());
if (!$t) {
return 1;
}
$duree = time() - $t;
list($a, $b) = genie_popularite_constantes($duree);
// du passe, faisons table (SQL) rase
sql_update('spip_articles', array('maj' => 'maj', 'popularite' => "popularite * $a"), 'popularite>1');
// enregistrer les metas...
$row = sql_fetsel('MAX(popularite) AS max, SUM(popularite) AS tot', "spip_articles");
ecrire_meta("popularite_max", $row['max']);
ecrire_meta("popularite_total", $row['tot']);
// Une fois par jour purger les referers du jour ; qui deviennent
// donc ceux de la veille ; au passage on stocke une date_statistiques
// dans spip_meta - cela permet au code d'etre "reentrant", ie ce cron
// peut etre appele par deux bases SPIP ne partageant pas le meme
// _DIR_TMP, sans tout casser...
$aujourdhui = date("Y-m-d");
if (($d = $GLOBALS['meta']['date_statistiques']) != $aujourdhui) {
spip_log("Popularite: purger referer depuis $d");
ecrire_meta('date_statistiques', $aujourdhui);
if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) == 0) {
spip_query("UPDATE spip_referers SET visites_veille=visites_jour, visites_jour=0");
} else
// version 3 fois plus rapide, mais en 2 requetes
#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'");
#spip_query("UPDATE spip_referers SET visites_jour=0");
// version 4 fois plus rapide que la premiere, en une seule requete
// ATTENTION : peut poser probleme cf https://core.spip.net/issues/2505
{
sql_alter("TABLE spip_referers DROP visites_veille,
CHANGE visites_jour visites_veille INT(10) UNSIGNED NOT NULL DEFAULT '0',
ADD visites_jour INT(10) UNSIGNED NOT NULL DEFAULT '0'");
}
}
// et c'est fini pour cette fois-ci
return 1;
}

331
genie/visites.php

@ -0,0 +1,331 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* 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. *
\***************************************************************************/
/**
* Gestion du compage des statistiques de visites (cron)
*
* @plugin Statistiques pour SPIP
* @license GNU/GPL
* @package SPIP\Statistiques\Genie
**/
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
if (!defined('_CRON_LOT_FICHIERS_VISITE')) {
define('_CRON_LOT_FICHIERS_VISITE', 100);
}
### Pour se debarrasser du md5, comment faire ? Un index sur 'referer' ?
### ou alors la meme notion, mais sans passer par des fonctions HEX ?
/**
* Prendre en compte un fichier de visite
*
* @param string $fichier
* Nom du fichier de visite
* @param int $visites
* Nombre de visites
* @param array $visites_a
* Couples id_article => nombre : comptage par identifiant d'article
* @param array $referers
* Couples url_referer => nombre : comptage par url de referer
* @param array $referers_a
* Couples id_article => array (url_referer => nombre) : comptage par article puis url de referer
* @return void
**/
function compte_fichier_visite($fichier, &$visites, &$visites_a, &$referers, &$referers_a) {
// Noter la visite du site (article 0)
$visites++;
$content = array();
if (lire_fichier($fichier, $content)) {
$content = @unserialize($content);
}
if (!is_array($content)) {
return;
}
foreach ($content as $source => $num) {
list($log_type, $log_id_num, $log_referer)
= preg_split(",\t,", $source, 3);
// Noter le referer
if ($log_referer) {
if (!isset($referers[$log_referer])) {
$referers[$log_referer] = 0;
}
$referers[$log_referer]++;
}
// S'il s'agit d'un article, noter ses visites
if ($log_type == 'article'
and $id_article = intval($log_id_num)
) {
if (!isset($visites_a[$id_article])) {
$visites_a[$id_article] = 0;
}
$visites_a[$id_article]++;
if ($log_referer) {
if (!isset($referers_a[$id_article][$log_referer])) {
$referers_a[$id_article][$log_referer] = 0;
}
$referers_a[$id_article][$log_referer]++;
}
}
}
}
/**
* Calcule les statistiques de visites, en plusieurs étapes
*
* @uses compte_fichier_visite()
* @uses genie_popularite_constantes()
*
* @param int $t
* Timestamp de la dernière exécution de cette tâche
* @return null|int
* - null si aucune visite à prendre en compte ou si tous les fichiers de visite sont traités,
* - entier négatif s'il reste encore des fichiers à traiter
**/
function calculer_visites($t) {
include_spip('base/abstract_sql');
// Initialisations
$visites = array(); # visites du site
$visites_a = array(); # tableau des visites des articles
$referers = array(); # referers du site
$referers_a = array(); # tableau des referers des articles
// charger un certain nombre de fichiers de visites,
// et faire les calculs correspondants
// Traiter jusqu'a 100 sessions datant d'au moins 30 minutes
$sessions = preg_files(sous_repertoire(_DIR_TMP, 'visites'));
$compteur = _CRON_LOT_FICHIERS_VISITE;
$date_init = time() - 30 * 60;
foreach ($sessions as $item) {
if (($d = @filemtime($item)) < $date_init) {
if (!$d) {
$d = $date_init;
} // si le fs ne donne pas de date, on prend celle du traitement, mais tout cela risque d'etre bien douteux
$d = date("Y-m-d", $d);
spip_log("traite la session $item");
compte_fichier_visite($item,
$visites[$d], $visites_a[$d], $referers[$d], $referers_a[$d]);
spip_unlink($item);
if (--$compteur <= 0) {
break;
}
}
#else spip_log("$item pas vieux");
}
if (!count($visites)) {
return;
}
include_spip('genie/popularites');
list($a, $b) = genie_popularite_constantes(24 * 3600);
// Maintenant on dispose de plusieurs tableaux qu'il faut ventiler dans
// les tables spip_visites, spip_visites_articles, spip_referers
// et spip_referers_articles ; attention a affecter tout ca a la bonne
// date (celle de la visite, pas celle du traitement)
foreach (array_keys($visites) as $date) {
if ($visites[$date]) {
// 1. les visites du site (facile)
if (!sql_countsel('spip_visites', "date='$date'")) {
sql_insertq('spip_visites',
array('date' => $date, 'visites' => $visites[$date]));
} else {
sql_update('spip_visites', array('visites' => "visites+" . intval($visites[$date])), "date='$date'");
}
// 2. les visites des articles
if ($visites_a[$date]) {
$ar = array(); # tableau num -> liste des articles ayant num visites
foreach ($visites_a[$date] as $id_article => $n) {
if (!sql_countsel('spip_visites_articles',
"id_article=$id_article AND date='$date'")
) {
sql_insertq('spip_visites_articles',
array(
'id_article' => $id_article,
'visites' => 0,
'date' => $date
));
}
$ar[$n][] = $id_article;
}
foreach ($ar as $n => $liste) {
$tous = sql_in('id_article', $liste);
sql_update('spip_visites_articles',
array('visites' => "visites+$n"),
"date='$date' AND $tous");
$ref = $noref = array();
foreach ($liste as $id) {
if (isset($referers_a[$id])) {