PageRenderTime 42ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins-dist/statistiques/public/stats.php

https://bitbucket.org/re_al_/real.test.spip
PHP | 150 lines | 84 code | 16 blank | 50 comment | 25 complexity | 69079ca4d6378cdb9d4c2cec9000d115 MD5 | raw file
Possible License(s): LGPL-2.1, MIT
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2016 *
  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. /**
  12. * Loguer une visite
  13. *
  14. * @plugin Statistiques pour SPIP
  15. * @license GNU/GPL
  16. * @package SPIP\Stats\Public
  17. **/
  18. if (!defined("_ECRIRE_INC_VERSION")) {
  19. return;
  20. }
  21. /**
  22. * Logue une visite sur une page
  23. *
  24. * Enregistre le passage d'un visiteur sur la page demandée
  25. * dans `tmp/visites/` qui seront ensuite traitées par une tache cron.
  26. *
  27. * Ne tient pas compte
  28. * - des visites de robots,
  29. * - des 404,
  30. * - des forum
  31. *
  32. * @see genie_visites_dist() Pour la tache cron qui traite les logs.
  33. *
  34. * @param array|null $contexte
  35. * Contexte d'appel de la page ; retrouvé automatiquement sinon.
  36. * @param string|null $referer
  37. * Referer de provenance ; retrouvé automatiquement sinon.
  38. * @return null|void
  39. **/
  40. function public_stats_dist($contexte = null, $referer = null) {
  41. if (!is_array($contexte)) {
  42. $contexte = $GLOBALS['contexte'];
  43. }
  44. if (is_null($referer)) {
  45. // $_SERVER["HTTP_REFERER"] ne fonctionne pas partout
  46. if (isset($_SERVER['HTTP_REFERER'])) {
  47. $referer = $_SERVER['HTTP_REFERER'];
  48. } else {
  49. if (isset($GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"])) {
  50. $referer = $GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"];
  51. }
  52. }
  53. }
  54. // Rejet des robots (qui sont pourtant des humains comme les autres)
  55. if (_IS_BOT or (isset($referer) and strpbrk($referer, '<>"\''))) {
  56. return;
  57. }
  58. // Ne pas tenir compte des tentatives de spam des forums
  59. if ($_SERVER['REQUEST_METHOD'] !== 'GET'
  60. or (isset($contexte['page']) and $contexte['page'] == 'forum')
  61. ) {
  62. return;
  63. }
  64. // rejet des pages 404
  65. if (isset($GLOBALS['page']['status'])
  66. and $GLOBALS['page']['status'] == 404
  67. ) {
  68. return;
  69. }
  70. // Identification du client
  71. $client_id = substr(md5(
  72. $GLOBALS['ip'] . (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '')
  73. // . $_SERVER['HTTP_ACCEPT'] # HTTP_ACCEPT peut etre present ou non selon que l'on est dans la requete initiale, ou dans les hits associes
  74. . (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '')
  75. . (isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '')
  76. ), 0, 10);
  77. // Analyse du referer
  78. $log_referer = '';
  79. if (!isset($GLOBALS['meta']['activer_referers']) or $GLOBALS['meta']['activer_referers'] == "oui") {
  80. if (isset($referer)) {
  81. $url_site_spip = preg_replace(',/$,', '',
  82. preg_replace(',^(https?://)?(www\.)?,i', '',
  83. url_de_base()));
  84. if (!(($url_site_spip <> '')
  85. and strpos('-' . strtolower($referer), strtolower($url_site_spip))
  86. and strpos($referer, "recherche=") === false)
  87. ) {
  88. $log_referer = $referer;
  89. }
  90. }
  91. }
  92. //
  93. // stockage sous forme de fichier tmp/visites/client_id
  94. //
  95. // 1. Chercher s'il existe deja une session pour ce numero IP.
  96. $content = array();
  97. $fichier = sous_repertoire(_DIR_TMP, 'visites') . $client_id;
  98. if (lire_fichier($fichier, $content)) {
  99. $content = @unserialize($content);
  100. }
  101. // fichier absent probablement (ou problème unserialize)
  102. if (!is_array($content)) {
  103. $content = array();
  104. }
  105. // 2. Plafonner le nombre de hits pris en compte pour un IP (robots etc.)
  106. // et ecrire la session
  107. if (count($content) < 200) {
  108. // Identification de l'element
  109. if (isset($contexte['id_article'])) {
  110. $log_type = "article";
  111. } elseif (isset($contexte['id_breve'])) {
  112. $log_type = "breve";
  113. } elseif (isset($contexte['id_rubrique'])) {
  114. $log_type = "rubrique";
  115. } else {
  116. $log_type = "";
  117. }
  118. if ($log_type) {
  119. $log_type .= "\t" . intval($contexte["id_$log_type"]);
  120. } else {
  121. $log_type = "autre\t0";
  122. }
  123. $log_type .= "\t" . trim($log_referer);
  124. if (isset($content[$log_type])) {
  125. $content[$log_type]++;
  126. } else {
  127. $content[$log_type] = 1;
  128. } // bienvenue au club
  129. ecrire_fichier($fichier, serialize($content));
  130. } else {
  131. $flood = sous_repertoire(_DIR_TMP, 'flood') . $GLOBALS['ip'];
  132. @touch($flood);
  133. }
  134. }