Subversion Repositories Sites.tela-botanica.org

Rev

Rev 439 | Rev 441 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 439 Rev 440
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 &eacute;t&eacute; calcul&eacute;es (datent de moins de '.round(NB_SEC_UPDATE/3600).' heures)</span><br />';
262
$res .= '<p>';
274
$res .= 'Execut&eacute; 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 &eacute;t&eacute; calcul&eacute;es (datent de moins de '.round(NB_SEC_UPDATE/3600).' heures)</span><br />';