29,7 → 29,7 |
//Auteur original : |
*@author Alexandre Granier <alexandre@tela-botanica.org> |
//Autres auteurs : |
*@author Aucun |
*@author Julien Grillot <julien.grillot@gmail.com> |
*@copyright Tela-Botanica 2000-2005 |
*@version $Revision:$ |
// +------------------------------------------------------------------------------------------------------+ |
42,29 → 42,17 |
|
include_once PROJET_CHEMIN_APPLI.'classes/ezmlmAccessObject.class.php'; |
include_once PROJET_CHEMIN_BIBLIOTHEQUE_API.'pear/XML/RSS.php'; |
|
// Ne pas changer : les groupes Yahoo se basent toujours sur la semaine |
define("NB_SEC_INSERT", 7*24*3600); |
define("NB_SEC_UPDATE", 2*3600); |
//if(!set_time_limit(100))return 'Impossible de changer le temps max d\execution'; |
//define("URL_WIKINI", "http://www.outils-reseaux.org/wikini/"); |
define("URL_WIKINI", "http://www.tela-botanica.org/wikini/"); |
|
function CurlFileGetContents($adresse, $timeout = 30){ |
$ch = curl_init($adresse); |
curl_setopt($ch, CURLOPT_HEADER, 0); |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); |
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); |
$page = curl_exec($ch); |
$CurlErr = curl_error($ch); |
curl_close($ch); |
if ($CurlErr){ |
echo $CurlErr; |
return false; |
}else{ |
return $page; |
} |
} |
|
/** |
* Retourne le contenu de la page $adresse de facon asynchrone |
* @param string $adresse URL de la page dont le contenu doit etre recupere |
* @param int timeout temps d'attente maximum avant abandon de la recuperation |
*/ |
function monFileGetContents($adresse, $timeout = 30){ |
$url = parse_url($adresse); |
$url['port'] = isset($url['port']) ? $url['port'] : '80'; |
76,9 → 64,6 |
} else { |
$header = 'GET '.$url['path'].' '.$url['scheme']."/1.1\r\n"; |
|
//$header .= 'Host: '.$url['host']."\r\n"; |
//$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"; |
|
$header .= "Host: www.yahoo.com\r\n"; |
$header .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204\r\n"; |
$header .= "Referer: http://www.yahoo.com/\r\n"; |
96,16 → 81,19 |
echo 'Le délai de réponse de la page <b>'.$adresse.'</b> a dépassé le timeout de <b>'.$timeout.'</b> sec.'; |
return false; |
}else{ |
//séparation du header |
//$page = substr($page, strpos($page, "\r\n\r\n")); |
//$page = trim($page); |
|
return 1; |
return $page; |
} |
} |
} |
|
function scanner($ligne, &$nombre_contrib, &$nombre_message, &$res) { |
/** |
* Procedure retrouvant le nombre de contribution, de message et le contenu de la page a partir des informations de la BDD |
* @param object $ligne resultat d'un fetch row contenant l'url du document a analyser |
* @param int $nombre_contrib recupere le nombre de contributions du projet |
* @param int $nombre_message recupere le nombre de nouveaux messages du projet |
* @return false si la fonction echoue lors de la tentative de recuperation des donnees utiles |
*/ |
function analyser($ligne, &$nombre_contrib, &$nombre_message) { |
$nombre_contrib='0'; |
$nombre_msg='0'; |
$r=false; |
120,23 → 108,21 |
if(!$nombre_message)$nombre_message='0'; |
ob_end_clean(); |
|
|
// Parse le flux RSS généré par wikini |
// Si AGO_A_NOMGRP alors il n'y a pas de flux RSS (groupe Yahoo, cad pas Tela) |
if($ligne->AGO_A_NOMGRP) { |
$url='http://fr.groups.yahoo.com/group/'.$ligne->AGO_A_NOMGRP; |
|
// Recherche du schema retrouvant le nombre de nouveaux message dans la semaine |
$pattern='>([0-9]+)</span> nouveau'; |
$contenu=file_get_contents($url); |
//$contenu=CurlFileGetContents($url); |
//$contenu=monFileGetContents($url); |
$contenu=monFileGetContents($url); |
|
$res.=$contenu; |
|
$r=($contenu?true:false); |
ereg($pattern, $contenu, $no); |
$nombre_message=$no[1]; |
|
//$rss =& new XML_RSS($url.'/rss'); |
|
} else { |
// Parse le flux RSS généré par wikini |
$rss =& new XML_RSS(URL_WIKINI.$ligne->p_wikini.'/wakka.php?wiki=DerniersChangementsRSS/xml'); |
$rss->parse(); |
|
159,6 → 145,7 |
return $r; |
} |
|
// Pour calculer le temps d'execution du script |
$start=microtime(true); |
|
|
184,6 → 171,7 |
} |
$res .= '<h1>Statistiques des projets</h1>'; |
|
// Un tableau c'est bien mais un beau tableau c'est mieux. |
$res .= '<style type="text/css">'; |
$res .= '.stats { border-spacing: 0px; }'; |
$res .= '.stats .stat_nb { text-align: center; }'; |
194,7 → 182,6 |
|
$calculs=false; |
|
//* |
$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>'; |
|
$nombre_contrib = 0; |
204,7 → 191,7 |
$nombre_contrib = 0; |
$nombre_message = 0; |
|
// On vérifie la date de derniere mise à jour |
// On verifie la date de derniere mise à jour |
$requete_verif='SELECT * FROM projet_statistiques WHERE ps_ce_projet="'.$ligne->p_id.'" ORDER BY ps_date DESC LIMIT 1'; |
$resultat_verif = $this->_db->query($requete_verif); |
if (DB::isError($resultat_verif)) { |
212,12 → 199,12 |
} |
$ligne_verif = $resultat_verif->fetchRow(DB_FETCHMODE_OBJECT); |
|
// Si elle remonte à plus de deux heure, on sauvegarde, et à plus de 7 jours, on archive et créé une nouvelle entrée |
// Si elle remonte a plus de deux heure, on sauvegarde, et a plus de 7 jours, on archive et créé une nouvelle entrée |
if($ligne_verif->ps_date > date("Y-m-d H:i:s", time()-NB_SEC_INSERT)) { |
if($ligne_verif->ps_maj < date("Y-m-d H:i:s", time()-NB_SEC_UPDATE)) { |
|
// Recupere nombre_contrib et nombre_message |
$calculs=scanner($ligne_verif, $nombre_contrib, $nombre_message, $res); |
$calculs=analyser($ligne_verif, $nombre_contrib, $nombre_message); |
|
$requete_maj = 'UPDATE projet_statistiques SET ps_msg_derniere_semaine="'.$nombre_message.'", ps_doc_derniere_semaine="'.$ligne->nb_doc.'", ps_nombre_inscrit="'.$ligne->nb_utilisateur.'", ps_nombre_inscrit_liste="'.$ligne->nb_utilisateur_liste.'", ps_modifwiki_derniere_semaine="'.$nombre_contrib.'", ps_maj=NOW() WHERE ps_ce_projet="'.$ligne->p_id.'" AND ps_date="'.$ligne->ps_date.'"'; |
$resultat_maj = $this->_db->query($requete_maj); |
234,7 → 221,7 |
} else { |
|
// Recupere nombre_contrib et nombre_message |
$calculs=scanner($ligne, $nombre_contrib, $nombre_message, $res); |
$calculs=analyser($ligne, $nombre_contrib, $nombre_message); |
|
$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) '. |
'VALUES ("'.$ligne->p_id.'", "'.$nombre_message.'", "'.$ligne->nb_doc.'", "'.$ligne->nb_utilisateur.'", "'.$ligne->nb_utilisateur_liste.'", "'.$nombre_contrib.'", NOW(), NOW())'; |
248,8 → 235,8 |
$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>'; |
} |
$res .= '</table>'; |
//*/ |
|
// Met a jour les statistiques et somme d'activite |
$sql="update `projet_statistiques` set ps_somme=(ps_msg_derniere_semaine +ps_doc_derniere_semaine+ps_nombre_inscrit_liste+ps_modifwiki_derniere_semaine);"; |
$resultat = $this->_db->query($sql); |
if (DB::isError($resultat)) { |
256,6 → 243,7 |
return $resultat->getMessage().$sql; |
} |
|
// On cherche le max pour ponderer les sommes |
$sql='SELECT MAX( ps_somme ) AS max FROM projet_statistiques WHERE ps_date>=CURDATE()'; |
$resultat = $this->_db->query($sql); |
if (DB::isError($resultat)) { |
263,6 → 251,7 |
} |
$tresultat = $resultat->fetchRow(DB_FETCHMODE_OBJECT); |
|
// On pondere |
$sql="UPDATE `projet_statistiques` SET ps_pourcent=ps_somme / ".($tresultat->max?$tresultat->max:1)." * 100 WHERE ps_date>=CURDATE();"; |
$resultat = $this->_db->query($sql); |
if (DB::isError($resultat)) { |
269,11 → 258,11 |
return $resultat->getMessage().$sql; |
} |
|
// On affiche quelques infos inutiles mais indispensables |
$res .= '<p>'; |
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 />'; |
$res .= 'Executé en '.(round((microtime(true)-$start)*1000)/1000).' secondes.</p>'; |
|
// $res .= $requete; |
return $res; |
|
/* +--Fin du code ---------------------------------------------------------------------------------------+ |