Subversion Repositories Sites.tela-botanica.org

Compare Revisions

Ignore whitespace Rev 439 → Rev 440

/trunk/client/projet/services/projet_statistiques.php
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';
75,10 → 63,7
return false;
} 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 &eacute;t&eacute; calcul&eacute;es (datent de moins de '.round(NB_SEC_UPDATE/3600).' heures)</span><br />';
$res .= 'Execut&eacute; en '.(round((microtime(true)-$start)*1000)/1000).' secondes.</p>';
 
// $res .= $requete;
return $res;
 
/* +--Fin du code ---------------------------------------------------------------------------------------+