Php5 - arborescence serveur + suivi projet

Description

Cette classe PHP5 permet de créér un fichier html pour le suivi d'un projet:
Il inscrit l'arborescence serveur (avec taille et nombre des dossiers et fichiers) avec quelques détails pouvant être utiles pour le suivi d'un projet, dans les fichiers php:
-Nombre de lignes de commentaire/Nbre de lignes total;
-Eventuelle connexion à Mysql;
-Nbre de fichiers inclus (Je sais pas si ca peut vous servir, moi oui, alors je vous le laisse...);
Cette liste devrait évoluer avec mes besoins, ou avec les votres si ca vous interesse

Quelques paramétrages:
-Possibilité de choisir de ne pas afficher certains dossiers (par leur nom)
-Possibilité de choisir soit toutes les extensions qu'on veut afficher, soit celles qu'on ne veut pas afficher
-Choix de si on veut ou pas afficher les dossiers vides (ou du moins qui ne contiennent
aucun fichier que l'on veut afficher)
-Choix des icones standardes ou de celles que vous désirez
-Choix d'afficher ou non les statistiques des fichiers php décrites au-dessus.
-Choix de conserver le bout de css qui est dans le fichier test_arbre.php, ou d'en créer un vous-même

En préparation:
-Notification dans les statistiques des fichiers contenant du javascript
-Application d'un fonction de callback définie par l'utilisateur sur les fichiers du type qu'il selectionne (Pour permettre, par exemple, de stocker dans un répertoire a_graver tous les fichiers dont la date de derniere modification est plus récente que x jours)
-Réctification des éventuelles erreurs trouvées par les utilisateurs
-Ajout de ce qui vous plaira, dans la limite du possible et de l'utile :-)

Un exemple d'utilisation est fourni dans le zip, avec des icones etc...

Source / Exemple :


<?php
class arbre
	{
	private $dossier;//Dossier de base à parcourir
	private $extensions;//voir plus bas
	private $dossiers_exclus;//voir plus bas
	public $unite_indentation = ' &nbsp; &nbsp; &nbsp; &nbsp;';//de base, plusieurs espaces, mais peut être remplacé par n'importe quoi (même des trucs pas beaux)
	public $afficher_dossiers_vides=TRUE;//TRUE/FALSE: On affiche (ou pas) les dossiers vides
	public $lister_parametres_php=TRUE;//TRUE/FALSE: On liste (ou pas) les paramètres choisis pour les fichiers php
	public $chemin_icones='icones/';//chemin vers le dossier contenant les icones. 
	//ATTENTION: les icones sont des fichiers gif ou jpeg nommés uniquement par l'extension; ex: $this->chemin_icones.'/php' est le nom de l'icone pour les fichiers php. Il n'y a pas d'extension
	
	/*						
	$extensions est un tableau contenant les extensions autorisées ou interdites;
	Si $extensions[0]='*', alors on accepte tout sauf le reste du tableau, sinon
	on accepte uniquement les extensions du tableau
	$dossiers_exclus contient les dossiers à ne pas prendre en compte;

  • /
function __construct($dossier='.',$extensions=array('*','htaccess','htpassword'),$dossiers_exclus=array()) {//constructeur, blablabla $this->dossier = $dossier; $this->extensions = $extensions; $this->dossiers_exclus = $dossiers_exclus; } function creer_fichier() {//On appelle la fonction récursive $retour=$this->parcourir($this->dossier,0,$taille,$nbfich,$nbdoss); //On crée la ligne de titre et on l'envoie avec le reste ($retour) return '<span class="stats_titre">Dossier: '.realpath($this->dossier).' ('.$this->afficher_nombre('fichier',$nbfich).$this->afficher_nombre('dossier',$nbdoss).round($taille/1024,2).' ko)</span>'.$retour; } private function afficher_nombre($quoi,$combien) {//permet juste de creer un message si nécessaire, et de le mettre au pluriel s'il le faut. Rien de bien comlpiqué if ($combien===0) return ''; if ($combien===1) return $combien.' '.$quoi.' - '; return $combien.' '.$quoi.'s - '; } function parcourir($dossieraparcourir,$debut,&$tailletotale,&$nbfichiers,&$nbdossiers) {//Fonction utilisée récursivement pour parcourir l'arborescence //initialisation des variables incrémentées $indent=''; $retour=''; $nbfichiers=0; //indentation faite avec des espaces //Création de la "hauteur" d'indentation for($num=0;$num<$debut;$num++) $indent .= $this->unite_indentation;//une unite pour chaque niveau //On charge le $dossieraparcourir dans le tableau $dir $dir=scandir($dossieraparcourir); //scandir classant par ordre alphabétique uniquement, on parcourt 2 fois le tableau; foreach($dir as $dirfile) {// la première fois pour les dossiers, classés alphabétiquement if(is_file($dossieraparcourir.'/'.$dirfile) OR $dirfile === '.' OR $dirfile === '..') continue;//Si c'est ., .. ou un fichier, on sort if (in_array($dirfile,$this->dossiers_exclus)) continue;//Si on choisit d'exclure ce dossier, on sort $nbdoss=0; //on récursivie tout ca $ledossier = $this->parcourir($dossieraparcourir.'/'.$dirfile,$debut+1,$taille,$nbfich,$nbdoss); if (strlen($ledossier)===0 AND $this->afficher_dossiers_vides === FALSE) continue; //On crée la ligne html $retour .= '<span class="stats_dossier">'.$indent.'<img src="'.$this->chemin_icones.'dossier_ferme.gif" width="15" height="15" />&nbsp;'.$dirfile.' ('.$this->afficher_nombre('fichier',$nbfich).$this->afficher_nombre('dossier',$nbdoss).round($taille/1024,2).' ko)</span>'."\n"; //On inscrit ce qui a été récupéré par récursivité $retour .= $ledossier; //On ajoute la taille de ce dossier à la taille totale $tailletotale += $taille; $nbfichiers += $nbfich; $nbdossiers += $nbdoss + 1; } foreach($dir as $dirfile) {// la deuxième fois pour les fichiers, toujours classés alphabétiquement //On crée une variable contenant l'adresse du fichier, celle ci étant relativement souvent utilisée $fichier=$dossieraparcourir.'/'.$dirfile; if(is_dir($fichier)) continue;//On sort si c'est un dossier $nbfichiers++;//incrémentation du nombre de fichiers //On récupère l'extension $extension=strtolower(array_pop(explode('.',$dirfile))); if ($this->extensions[0]==='*' AND in_array($extension,$this->extensions)) continue;//Si on choisit par défaut toutes les extensions, mais qu'on éxclut celle-la, on sort elseif ($this->extensions[0]!=='*' AND !in_array($extension,$this->extensions)) continue;//Si cette extension n'est pas dans la liste autorisée, on sort aussi //Si l'icone de cette extension existe, on l'affiche, sinon on affiche defaut if (is_file($this->chemin_icones.$extension)) $retour .= '<span class="stats_fichier">'.$indent.'<img src="'.$this->chemin_icones.$extension.'" width="15" height="15" />&nbsp;'; else $retour .= '<span class="stats_fichier">'.$indent.'<img src="'.$this->chemin_icones.'defaut" width="15" height="15" />&nbsp;'; //on inscrit le nom et la taille du fichier $retour.= $dirfile.' ('.round(filesize($fichier)/1024,2).' ko)</span>'."\n"; $tailletotale += filesize($fichier); //si c'est un fichier php, qu'on choisit d'afficher des stats, et que ce n'est pas l'icone (fichier juste nommé php) if (in_array(strtolower($extension),array('php','php3','php4','php5','php6')) AND $this->lister_parametres_php AND $dirfile!=='php') { $stat_incl=$this->voir_params($fichier); //On insère le résultat uniquement s'il y a quelque chose à afficher if (strlen($stat_incl)>0) $retour.='<span class="stats_commentaire">'.$indent.$this->unite_indentation.$stat_incl."</span>\n"; } } //On renvoie la sortie return $retour; } function voir_params($fichier) {//fonction punlique, pour pouvoir l'appeler sur un fichier particulier sans avoir à tout regarder //motif de recherche des inclusions $motif = "/( |\n)(include|include_once|require|require_once)\((.+)\)/"; //récup du contenu du fichier $contenu=file_get_contents($fichier); //on récupère les inclusions preg_match_all($motif,$contenu,$reponse,PREG_SET_ORDER); //on les compte $nbinclusions=count($reponse); //On recherche une ouverture de connection mysql, auquel cas on crée le message qui le stipule if (strpos($contenu,'mysql_'.'connect')!==FALSE) $mysql=' Connection à mysql;'; else $mysql=''; //on divise en un tableau de ligne, comme l'aurait fait file($fichier) $lignes=explode("\n",$contenu); //Initialisation des variables $nbcom=0; $ouvert=FALSE; $nblignes=0; foreach($lignes as $ligne) { $ligne=str_replace(' ',' ',$ligne);//Pour compter comme il faut les lignes de code, sans tenir compte des lignes ne contenant que des tabulations if (trim($ligne)==='') continue;//On ne compte pas les lignes vides if (strpos($ligne,'*/')!==FALSE AND strpos($ligne,'/*')!==FALSE) $nbcom++;//S'il y a /* et */, on compte uniquement la ligne en commentaire (Ne tient donc pas compte d'un éventuel /*com*/[code]/*, mais faut pas abuser) elseif ($ouvert AND strpos($ligne,'*/')!==FALSE) {//Si le commentaire est ouvert et qu'on le ferme, on fait pareil $ouvert=FALSE; $nbcom++; } elseif ($ouvert) $nbcom++;//Si le commentaire ouvert et qu'il ne contient pas de */ elseif (strpos($ligne,'/*')!==FALSE) {//Si on est hors commentaire, et qu'on en ouvre un, on fait pareil $nbcom++; $ouvert=TRUE; } elseif (strpos($ligne,'//')!==FALSE) $nbcom++;//Pour compter les commentaires en ligne. Celle-ci étant commentée, on la compte comme un ligne complète de commentaire $nblignes++; } //On crée le message donnant le nombre d'inclusions if ($nbinclusions>0) $phraseinclusions=$nbinclusions.' inclusion(s);'; else $phraseinclusions=''; //On crée le message donnant le nombre de lignes commentées par rapport au nombre de lignes total if ($nbcom>0) $phrasecommentaires=' '.$nbcom.' lignes de commentaire sur '.$nblignes.';'; else $phrasecommentaires=''; //On envoit le message en retour return $phraseinclusions.$phrasecommentaires.$mysql; } }

Conclusion :


Pour le moment, aucun bug trouvé, mais je compte sur vous pour me le signaler si vous en voyez. En tout cas, windows donne les même statistiques de poids. ;-)

Je l'ai mis en initié en pensant que tous les débutants ne pourront pas comprendre l'intégralité du code (pas de l'utilisation j'espère) facilement, mais si vous ne pensez pas que ca ne vaut ce niveau, signalez le moi, je modifierai...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.