Line 27... |
Line 27... |
27 |
*
|
27 |
*
|
28 |
*@package projet
|
28 |
*@package projet
|
29 |
//Auteur original :
|
29 |
//Auteur original :
|
30 |
*@author Alexandre Granier <alexandre@tela-botanica.org>
|
30 |
*@author Alexandre Granier <alexandre@tela-botanica.org>
|
31 |
//Autres auteurs :
|
31 |
//Autres auteurs :
|
32 |
*@author Aucun
|
32 |
*@author Julien Grillot <julien.grillot@gmail.com>
|
33 |
*@copyright Tela-Botanica 2000-2005
|
33 |
*@copyright Tela-Botanica 2000-2005
|
34 |
*@version $Revision:$
|
34 |
*@version $Revision:$
|
35 |
// +------------------------------------------------------------------------------------------------------+
|
35 |
// +------------------------------------------------------------------------------------------------------+
|
36 |
*/
|
36 |
*/
|
Line 40... |
Line 40... |
40 |
// +------------------------------------------------------------------------------------------------------+
|
40 |
// +------------------------------------------------------------------------------------------------------+
|
Line 41... |
Line 41... |
41 |
|
41 |
|
42 |
|
42 |
|
- |
|
43 |
include_once PROJET_CHEMIN_APPLI.'classes/ezmlmAccessObject.class.php';
|
- |
|
44 |
include_once PROJET_CHEMIN_BIBLIOTHEQUE_API.'pear/XML/RSS.php';
|
43 |
include_once PROJET_CHEMIN_APPLI.'classes/ezmlmAccessObject.class.php';
|
45 |
|
44 |
include_once PROJET_CHEMIN_BIBLIOTHEQUE_API.'pear/XML/RSS.php';
|
46 |
// Ne pas changer : les groupes Yahoo se basent toujours sur la semaine
|
45 |
define("NB_SEC_INSERT", 7*24*3600);
|
- |
|
46 |
define("NB_SEC_UPDATE", 2*3600);
|
- |
|
47 |
//if(!set_time_limit(100))return 'Impossible de changer le temps max d\execution';
|
47 |
define("NB_SEC_INSERT", 7*24*3600);
|
Line -... |
Line 48... |
- |
|
48 |
define("NB_SEC_UPDATE", 2*3600);
|
48 |
//define("URL_WIKINI", "http://www.outils-reseaux.org/wikini/");
|
49 |
define("URL_WIKINI", "http://www.tela-botanica.org/wikini/");
|
49 |
define("URL_WIKINI", "http://www.tela-botanica.org/wikini/");
|
- |
|
50 |
|
- |
|
51 |
function CurlFileGetContents($adresse, $timeout = 30){
|
- |
|
52 |
$ch = curl_init($adresse);
|
50 |
|
53 |
curl_setopt($ch, CURLOPT_HEADER, 0);
|
51 |
/**
|
54 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
- |
|
55 |
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
|
- |
|
56 |
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
|
- |
|
57 |
$page = curl_exec($ch);
|
- |
|
58 |
$CurlErr = curl_error($ch);
|
- |
|
59 |
curl_close($ch);
|
- |
|
60 |
if ($CurlErr){
|
- |
|
61 |
echo $CurlErr;
|
- |
|
62 |
return false;
|
52 |
* Retourne le contenu de la page $adresse de facon asynchrone
|
63 |
}else{
|
- |
|
64 |
return $page;
|
- |
|
65 |
}
|
53 |
* @param string $adresse URL de la page dont le contenu doit etre recupere
|
66 |
}
|
54 |
* @param int timeout temps d'attente maximum avant abandon de la recuperation
|
67 |
|
55 |
*/
|
68 |
function monFileGetContents($adresse, $timeout = 30){
|
56 |
function monFileGetContents($adresse, $timeout = 30){
|
69 |
$url = parse_url($adresse);
|
57 |
$url = parse_url($adresse);
|
70 |
$url['port'] = isset($url['port']) ? $url['port'] : '80';
|
58 |
$url['port'] = isset($url['port']) ? $url['port'] : '80';
|
71 |
$url['scheme'] = isset($url['scheme']) ? strtoupper($url['scheme']) : 'HTTP';
|
59 |
$url['scheme'] = isset($url['scheme']) ? strtoupper($url['scheme']) : 'HTTP';
|
72 |
$fp = fsockopen($url['host'], $url['port'], $errno, $errstr, $timeout);
|
60 |
$fp = fsockopen($url['host'], $url['port'], $errno, $errstr, $timeout);
|
73 |
if (!$fp) {
|
61 |
if (!$fp) {
|
74 |
echo "Erreur de socket: $errno - $errstr<br />\n";
|
62 |
echo "Erreur de socket: $errno - $errstr<br />\n";
|
75 |
return false;
|
63 |
return false;
|
76 |
} else {
|
- |
|
77 |
$header = 'GET '.$url['path'].' '.$url['scheme']."/1.1\r\n";
|
- |
|
78 |
|
- |
|
79 |
//$header .= 'Host: '.$url['host']."\r\n";
|
64 |
} else {
|
80 |
//$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";
|
65 |
$header = 'GET '.$url['path'].' '.$url['scheme']."/1.1\r\n";
|
81 |
|
66 |
|
Line 82... |
Line 67... |
82 |
$header .= "Host: www.yahoo.com\r\n";
|
67 |
$header .= "Host: www.yahoo.com\r\n";
|
Line 94... |
Line 79... |
94 |
fclose($fp);
|
79 |
fclose($fp);
|
95 |
if ($stream['timed_out']) {
|
80 |
if ($stream['timed_out']) {
|
96 |
echo 'Le délai de réponse de la page <b>'.$adresse.'</b> a dépassé le timeout de <b>'.$timeout.'</b> sec.';
|
81 |
echo 'Le délai de réponse de la page <b>'.$adresse.'</b> a dépassé le timeout de <b>'.$timeout.'</b> sec.';
|
97 |
return false;
|
82 |
return false;
|
98 |
}else{
|
83 |
}else{
|
99 |
//séparation du header
|
- |
|
100 |
//$page = substr($page, strpos($page, "\r\n\r\n"));
|
- |
|
101 |
//$page = trim($page);
|
- |
|
102 |
|
- |
|
103 |
return 1;
|
84 |
return $page;
|
104 |
}
|
85 |
}
|
105 |
}
|
86 |
}
|
106 |
}
|
87 |
}
|
Line -... |
Line 88... |
- |
|
88 |
|
- |
|
89 |
/**
|
- |
|
90 |
* Procedure retrouvant le nombre de contribution, de message et le contenu de la page a partir des informations de la BDD
|
- |
|
91 |
* @param object $ligne resultat d'un fetch row contenant l'url du document a analyser
|
- |
|
92 |
* @param int $nombre_contrib recupere le nombre de contributions du projet
|
- |
|
93 |
* @param int $nombre_message recupere le nombre de nouveaux messages du projet
|
- |
|
94 |
* @return false si la fonction echoue lors de la tentative de recuperation des donnees utiles
|
107 |
|
95 |
*/
|
108 |
function scanner($ligne, &$nombre_contrib, &$nombre_message, &$res) {
|
96 |
function analyser($ligne, &$nombre_contrib, &$nombre_message) {
|
109 |
$nombre_contrib='0';
|
97 |
$nombre_contrib='0';
|
110 |
$nombre_msg='0';
|
98 |
$nombre_msg='0';
|
Line 111... |
Line 99... |
111 |
$r=false;
|
99 |
$r=false;
|
Line 118... |
Line 106... |
118 |
$xml_parser->parse();
|
106 |
$xml_parser->parse();
|
119 |
$nombre_message = ob_get_contents();
|
107 |
$nombre_message = ob_get_contents();
|
120 |
if(!$nombre_message)$nombre_message='0';
|
108 |
if(!$nombre_message)$nombre_message='0';
|
121 |
ob_end_clean();
|
109 |
ob_end_clean();
|
Line 122... |
Line -... |
122 |
|
- |
|
123 |
|
110 |
|
124 |
// Parse le flux RSS généré par wikini
|
111 |
// Si AGO_A_NOMGRP alors il n'y a pas de flux RSS (groupe Yahoo, cad pas Tela)
|
125 |
if($ligne->AGO_A_NOMGRP) {
|
112 |
if($ligne->AGO_A_NOMGRP) {
|
126 |
$url='http://fr.groups.yahoo.com/group/'.$ligne->AGO_A_NOMGRP;
|
- |
|
127 |
$pattern='>([0-9]+)</span> nouveau';
|
- |
|
128 |
$contenu=file_get_contents($url);
|
- |
|
129 |
//$contenu=CurlFileGetContents($url);
|
- |
|
Line -... |
Line 113... |
- |
|
113 |
$url='http://fr.groups.yahoo.com/group/'.$ligne->AGO_A_NOMGRP;
|
- |
|
114 |
|
130 |
//$contenu=monFileGetContents($url);
|
115 |
// Recherche du schema retrouvant le nombre de nouveaux message dans la semaine
|
Line 131... |
Line 116... |
131 |
|
116 |
$pattern='>([0-9]+)</span> nouveau';
|
132 |
$res.=$contenu;
|
117 |
$contenu=monFileGetContents($url);
|
133 |
|
118 |
|
Line 134... |
Line -... |
134 |
$r=($contenu?true:false);
|
- |
|
- |
|
119 |
$r=($contenu?true:false);
|
135 |
ereg($pattern, $contenu, $no);
|
120 |
ereg($pattern, $contenu, $no);
|
- |
|
121 |
$nombre_message=$no[1];
|
136 |
$nombre_message=$no[1];
|
122 |
|
137 |
|
123 |
|
Line 138... |
Line 124... |
138 |
//$rss =& new XML_RSS($url.'/rss');
|
124 |
} else {
|
139 |
} else {
|
125 |
// Parse le flux RSS généré par wikini
|
Line 157... |
Line 143... |
157 |
}
|
143 |
}
|
Line 158... |
Line 144... |
158 |
|
144 |
|
159 |
return $r;
|
145 |
return $r;
|
Line -... |
Line 146... |
- |
|
146 |
}
|
160 |
}
|
147 |
|
Line 161... |
Line 148... |
161 |
|
148 |
// Pour calculer le temps d'execution du script
|
162 |
$start=microtime(true);
|
149 |
$start=microtime(true);
|
Line 182... |
Line 169... |
182 |
if (DB::isError($resultat)) {
|
169 |
if (DB::isError($resultat)) {
|
183 |
return ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
|
170 |
return ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
|
184 |
}
|
171 |
}
|
185 |
$res .= '<h1>Statistiques des projets</h1>';
|
172 |
$res .= '<h1>Statistiques des projets</h1>';
|
Line -... |
Line 173... |
- |
|
173 |
|
186 |
|
174 |
// Un tableau c'est bien mais un beau tableau c'est mieux.
|
187 |
$res .= '<style type="text/css">';
|
175 |
$res .= '<style type="text/css">';
|
188 |
$res .= '.stats { border-spacing: 0px; }';
|
176 |
$res .= '.stats { border-spacing: 0px; }';
|
189 |
$res .= '.stats .stat_nb { text-align: center; }';
|
177 |
$res .= '.stats .stat_nb { text-align: center; }';
|
190 |
$res .= '.stats th { font-weight: bold; }';
|
178 |
$res .= '.stats th { font-weight: bold; }';
|
191 |
$res .= '.stats td { border-bottom: 1px #ddd solid; }';
|
179 |
$res .= '.stats td { border-bottom: 1px #ddd solid; }';
|
192 |
$res .= '.warning { color: #800; font-weight: bold; }';
|
180 |
$res .= '.warning { color: #800; font-weight: bold; }';
|
Line 193... |
Line 181... |
193 |
$res .= '</style>';
|
181 |
$res .= '</style>';
|
Line 194... |
Line -... |
194 |
|
- |
|
195 |
$calculs=false;
|
182 |
|
Line 196... |
Line 183... |
196 |
|
183 |
$calculs=false;
|
197 |
//*
|
184 |
|
Line 198... |
Line 185... |
198 |
$res .= '<table cellspacing="0" class="stats" style="width: 100%"><tr><th>Nom du projet</th><th>Nom liste</th><th>Inscrits</th><th>Utilisateurs</th><th>Nb msg</th><th>Nb doc</th><th>Nb contrib</th></tr>';
|
185 |
$res .= '<table cellspacing="0" class="stats" style="width: 100%"><tr><th>Nom du projet</th><th>Nom liste</th><th>Inscrits</th><th>Utilisateurs</th><th>Nb msg</th><th>Nb doc</th><th>Nb contrib</th></tr>';
|
199 |
|
186 |
|
200 |
$nombre_contrib = 0;
|
187 |
$nombre_contrib = 0;
|
Line 201... |
Line 188... |
201 |
$nombre_message = 0;
|
188 |
$nombre_message = 0;
|
202 |
|
189 |
|
203 |
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
|
190 |
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
|
204 |
$nombre_contrib = 0;
|
191 |
$nombre_contrib = 0;
|
205 |
$nombre_message = 0;
|
192 |
$nombre_message = 0;
|
206 |
|
193 |
|
207 |
// On vérifie la date de derniere mise à jour
|
194 |
// On verifie la date de derniere mise à jour
|
Line 208... |
Line 195... |
208 |
$requete_verif='SELECT * FROM projet_statistiques WHERE ps_ce_projet="'.$ligne->p_id.'" ORDER BY ps_date DESC LIMIT 1';
|
195 |
$requete_verif='SELECT * FROM projet_statistiques WHERE ps_ce_projet="'.$ligne->p_id.'" ORDER BY ps_date DESC LIMIT 1';
|
209 |
$resultat_verif = $this->_db->query($requete_verif);
|
196 |
$resultat_verif = $this->_db->query($requete_verif);
|
210 |
if (DB::isError($resultat_verif)) {
|
197 |
if (DB::isError($resultat_verif)) {
|
Line 211... |
Line 198... |
211 |
return $resultat_verif->getMessage().$resultat_verif;
|
198 |
return $resultat_verif->getMessage().$resultat_verif;
|
212 |
}
|
199 |
}
|
Line 213... |
Line 200... |
213 |
$ligne_verif = $resultat_verif->fetchRow(DB_FETCHMODE_OBJECT);
|
200 |
$ligne_verif = $resultat_verif->fetchRow(DB_FETCHMODE_OBJECT);
|
214 |
|
201 |
|
215 |
// Si elle remonte à plus de deux heure, on sauvegarde, et à plus de 7 jours, on archive et créé une nouvelle entrée
|
202 |
// Si elle remonte a plus de deux heure, on sauvegarde, et a plus de 7 jours, on archive et créé une nouvelle entrée
|
216 |
if($ligne_verif->ps_date > date("Y-m-d H:i:s", time()-NB_SEC_INSERT)) {
|
203 |
if($ligne_verif->ps_date > date("Y-m-d H:i:s", time()-NB_SEC_INSERT)) {
|
Line 232... |
Line 219... |
232 |
}
|
219 |
}
|
Line 233... |
Line 220... |
233 |
|
220 |
|
Line 234... |
Line 221... |
234 |
} else {
|
221 |
} else {
|
235 |
|
222 |
|
Line 236... |
Line 223... |
236 |
// Recupere nombre_contrib et nombre_message
|
223 |
// Recupere nombre_contrib et nombre_message
|
237 |
$calculs=scanner($ligne, $nombre_contrib, $nombre_message, $res);
|
224 |
$calculs=analyser($ligne, $nombre_contrib, $nombre_message);
|
238 |
|
225 |
|
239 |
$requete_maj = 'INSERT INTO projet_statistiques (ps_ce_projet, ps_msg_derniere_semaine, ps_doc_derniere_semaine, ps_nombre_inscrit, ps_nombre_inscrit_liste, ps_modifwiki_derniere_semaine, ps_date, ps_maj) '.
|
226 |
$requete_maj = 'INSERT INTO projet_statistiques (ps_ce_projet, ps_msg_derniere_semaine, ps_doc_derniere_semaine, ps_nombre_inscrit, ps_nombre_inscrit_liste, ps_modifwiki_derniere_semaine, ps_date, ps_maj) '.
|
Line 246... |
Line 233... |
246 |
|
233 |
|
247 |
// Et on affiche les stats courantes
|
234 |
// Et on affiche les stats courantes
|
248 |
$res .= '<tr><td>'.$ligne->p_titre.'</td><td>'.($ligne->pl_nom_liste?$ligne->pl_nom_liste:$ligne->AGO_A_NOMGRP.' (Yahoo)').'</td><td class="stat_nb">'.$ligne->nb_utilisateur_liste.'</td><td class="stat_nb">'.$ligne->nb_utilisateur.'</td><td class="stat_nb">'.$nombre_message.'</td><td class="stat_nb">'.$ligne->nb_doc.'</td><td class="stat_nb">'.$nombre_contrib.'</td></tr>';
|
235 |
$res .= '<tr><td>'.$ligne->p_titre.'</td><td>'.($ligne->pl_nom_liste?$ligne->pl_nom_liste:$ligne->AGO_A_NOMGRP.' (Yahoo)').'</td><td class="stat_nb">'.$ligne->nb_utilisateur_liste.'</td><td class="stat_nb">'.$ligne->nb_utilisateur.'</td><td class="stat_nb">'.$nombre_message.'</td><td class="stat_nb">'.$ligne->nb_doc.'</td><td class="stat_nb">'.$nombre_contrib.'</td></tr>';
|
249 |
}
|
236 |
}
|
250 |
$res .= '</table>';
|
- |
|
Line -... |
Line 237... |
- |
|
237 |
$res .= '</table>';
|
251 |
//*/
|
238 |
|
252 |
|
239 |
// Met a jour les statistiques et somme d'activite
|
253 |
$sql="update `projet_statistiques` set ps_somme=(ps_msg_derniere_semaine +ps_doc_derniere_semaine+ps_nombre_inscrit_liste+ps_modifwiki_derniere_semaine);";
|
240 |
$sql="update `projet_statistiques` set ps_somme=(ps_msg_derniere_semaine +ps_doc_derniere_semaine+ps_nombre_inscrit_liste+ps_modifwiki_derniere_semaine);";
|
254 |
$resultat = $this->_db->query($sql);
|
241 |
$resultat = $this->_db->query($sql);
|
255 |
if (DB::isError($resultat)) {
|
242 |
if (DB::isError($resultat)) {
|
Line -... |
Line 243... |
- |
|
243 |
return $resultat->getMessage().$sql;
|
256 |
return $resultat->getMessage().$sql;
|
244 |
}
|
257 |
}
|
245 |
|
258 |
|
246 |
// On cherche le max pour ponderer les sommes
|
259 |
$sql='SELECT MAX( ps_somme ) AS max FROM projet_statistiques WHERE ps_date>=CURDATE()';
|
247 |
$sql='SELECT MAX( ps_somme ) AS max FROM projet_statistiques WHERE ps_date>=CURDATE()';
|
260 |
$resultat = $this->_db->query($sql);
|
248 |
$resultat = $this->_db->query($sql);
|
261 |
if (DB::isError($resultat)) {
|
249 |
if (DB::isError($resultat)) {
|
Line -... |
Line 250... |
- |
|
250 |
return $resultat->getMessage().$sql;
|
262 |
return $resultat->getMessage().$sql;
|
251 |
}
|
263 |
}
|
252 |
$tresultat = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
|
264 |
$tresultat = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
|
253 |
|
265 |
|
254 |
// On pondere
|
266 |
$sql="UPDATE `projet_statistiques` SET ps_pourcent=ps_somme / ".($tresultat->max?$tresultat->max:1)." * 100 WHERE ps_date>=CURDATE();";
|
255 |
$sql="UPDATE `projet_statistiques` SET ps_pourcent=ps_somme / ".($tresultat->max?$tresultat->max:1)." * 100 WHERE ps_date>=CURDATE();";
|
Line -... |
Line 256... |
- |
|
256 |
$resultat = $this->_db->query($sql);
|
267 |
$resultat = $this->_db->query($sql);
|
257 |
if (DB::isError($resultat)) {
|
268 |
if (DB::isError($resultat)) {
|
258 |
return $resultat->getMessage().$sql;
|
269 |
return $resultat->getMessage().$sql;
|
259 |
}
|
Line 270... |
Line -... |
270 |
}
|
- |
|
271 |
|
260 |
|
Line 272... |
Line 261... |
272 |
$res .= '<p>';
|
261 |
// On affiche quelques infos inutiles mais indispensables
|
273 |
if(!$calculs)$res .= '<span class="warning">Les variables nb_msg et nb_contrib n\'ont pas été calculées (datent de moins de '.round(NB_SEC_UPDATE/3600).' heures)</span><br />';
|
262 |
$res .= '<p>';
|
274 |
$res .= 'Executé en '.(round((microtime(true)-$start)*1000)/1000).' secondes.</p>';
|
263 |
if(!$calculs)$res .= '<span class="warning">Les variables nb_msg et nb_contrib n\'ont pas été calculées (datent de moins de '.round(NB_SEC_UPDATE/3600).' heures)</span><br />';
|