stats_visites_to_array.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. include_spip('inc/statistiques');
  13. // moyenne glissante sur 30 jours
  14. define('MOYENNE_GLISSANTE_JOUR', 30);
  15. // moyenne glissante sur 12 mois
  16. define('MOYENNE_GLISSANTE_MOIS', 12);
  17. function inc_stats_visites_to_array_dist($unite, $duree, $id_article, $options = array()) {
  18. $now = time();
  19. if (!in_array($unite,array('jour','mois')))
  20. $unite = 'jour';
  21. $serveur = '';
  22. $table = "spip_visites";
  23. $order = "date";
  24. $where = array();
  25. if ($duree)
  26. $where[] = sql_date_proche($order,-$duree,'day',$serveur);
  27. if ($id_article) {
  28. $table = "spip_visites_articles";
  29. $where[] = "id_article=".intval($id_article);
  30. }
  31. $where = implode(" AND ",$where);
  32. $format = ($unite=='jour'?'%Y-%m-%d':'%Y-%m-01');
  33. $res = sql_select("SUM(visites) AS v, DATE_FORMAT($order,'$format') AS d", $table, $where, "d", "d", "",'',$serveur);
  34. $format = str_replace('%','',$format);
  35. $periode = ($unite=='jour'?24*3600:365*24*3600/12);
  36. $step = intval(round($periode*1.1,0));
  37. $glisse = constant('MOYENNE_GLISSANTE_'.strtoupper($unite));
  38. moyenne_glissante();
  39. $data = array();
  40. $r = sql_fetch($res,$serveur);
  41. if (!$r){
  42. $r = array('d'=>date($format,$now),'v'=>0);
  43. }
  44. do {
  45. $data[$r['d']] = array('visites'=>$r['v'],'moyenne'=>moyenne_glissante($r['v'], $glisse));
  46. $last = $r['d'];
  47. // donnee suivante
  48. $r = sql_fetch($res,$serveur);
  49. // si la derniere n'est pas la date courante, l'ajouter
  50. if (!$r AND $last!=date($format,$now))
  51. $r = array('d'=>date($format,$now),'v'=>0);
  52. // completer les trous manquants si besoin
  53. if ($r){
  54. $next = strtotime($last);
  55. $current = strtotime($r['d']);
  56. while (($next+=$step)<$current AND $d=date($format,$next)){
  57. if (!isset($data[$d]))
  58. $data[$d] = array('visites'=>0,'moyenne'=>moyenne_glissante(0, $glisse));
  59. $last = $d;
  60. $next = strtotime($last);
  61. }
  62. }
  63. }
  64. while ($r);
  65. // projection pour la derniere barre :
  66. // mesure courante
  67. // + moyenne au pro rata du temps qui reste
  68. $moyenne = end($data);
  69. $moyenne = prev($data);
  70. $moyenne = ($moyenne AND isset($moyenne['moyenne']))?$moyenne['moyenne']:0;
  71. $data[$last]['moyenne'] = $moyenne;
  72. // temps restant
  73. $remaining = strtotime(date($format,strtotime(date($format,$now))+$step))-$now;
  74. $prorata = $remaining/$periode;
  75. // projection
  76. $data[$last]['prevision'] = $data[$last]['visites'] + intval(round($moyenne*$prorata));
  77. return $data;
  78. }
  79. ?>