web-dev-qa-db-fra.com

compter les lignes dans un projet PHP

Connaissez-vous un outil capable de compter toutes les lignes de code d'un projet PHP?

54
Duncan Benoit

Sur un système d'exploitation POSIX (par exemple Linux ou OS X), vous pouvez écrire ce qui suit dans votre Bash Shell:

wc -l `find . -iname "*.php"`

Cela comptera les lignes de tous les fichiers php du répertoire courant et aussi des sous-répertoires. (Notez que ces "guillemets" simples sont des guillemets, pas des guillemets simples réels)

98
Henrik Paul

Je me suis fait un petit script pour le faire dans l'un de mes projets. Utilisez simplement le code suivant sur une page php à la racine de votre projet. Le script effectuera une vérification récursive des sous-dossiers.

<?php
/**
 * A very simple stats counter for all kind of stats about a development folder
 * 
 * @author Joel Lord
 * @copyright Engrenage (www.engrenage.biz)
 * 
 * For more information: [email protected]

 */


$fileCounter = array();
$totalLines = countLines('.', $fileCounter); 
echo $totalLines." lines in the current folder<br>";
echo $totalLines - $fileCounter['gen']['commentedLines'] - $fileCounter['gen']['blankLines'] ." actual lines of code (not a comment or blank line)<br><br>";

foreach($fileCounter['gen'] as $key=>$val) {
    echo ucfirst($key).":".$val."<br>";
}

echo "<br>";

foreach($fileCounter as $key=>$val) {
    if(!is_array($val)) echo strtoupper($key).":".$val." file(s)<br>";
}




function countLines($dir, &$fileCounter) {
    $_allowedFileTypes = "(html|htm|phtml|php|js|css|ini)";
    $lineCounter = 0;
    $dirHandle = opendir($dir);
    $path = realpath($dir);
    $nextLineIsComment = false;

    if($dirHandle) {
        while(false !== ($file = readdir($dirHandle))) {
            if(is_dir($path."/".$file) && ($file !== '.' && $file !== '..')) {
                $lineCounter += countLines($path."/".$file, $fileCounter);
            } elseif($file !== '.' && $file !== '..') {
                //Check if we have a valid file 
                $ext = _findExtension($file);
                if(preg_match("/".$_allowedFileTypes."$/i", $ext)) {
                    $realFile = realpath($path)."/".$file;
                    $fileHandle = fopen($realFile, 'r');
                    $fileArray = file($realFile);
                    //Check content of file:
                    for($i=0; $i<count($fileArray); $i++) {
                        if($nextLineIsComment) {
                            $fileCounter['gen']['commentedLines']++;
                            //Look for the end of the comment block
                            if(strpos($fileArray[$i], '*/')) {
                                $nextLineIsComment = false;
                            }
                        } else {
                            //Look for a function
                            if(strpos($fileArray[$i], 'function')) {
                                $fileCounter['gen']['functions']++;
                            }
                            //Look for a commented line
                            if(strpos($fileArray[$i], '//')) {
                                $fileCounter['gen']['commentedLines']++;
                            }
                            //Look for a class
                            if(substr(trim($fileArray[$i]), 0, 5) == 'class') {
                                $fileCounter['gen']['classes']++;
                            }
                            //Look for a comment block
                            if(strpos($fileArray[$i], '/*')) {
                                $nextLineIsComment = true;
                                $fileCounter['gen']['commentedLines']++;
                                $fileCounter['gen']['commentBlocks']++;
                            }
                            //Look for a blank line
                            if(trim($fileArray[$i]) == '') {
                                $fileCounter['gen']['blankLines']++;
                            }
                        }

                    }
                    $lineCounter += count($fileArray);
                }
                //Add to the files counter
                $fileCounter['gen']['totalFiles']++;
                $fileCounter[strtolower($ext)]++;
            }
        }
    } else echo 'Could not enter folder';

    return $lineCounter;
}

function _findExtension($filename) {
    $filename = strtolower($filename) ; 
    $exts = split("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts;  
}
20
Joel Lord

SLOCCount est un outil génial qui produit un rapport de comptage de lignes pour un grand nombre de langues. Il va également plus loin en produisant d'autres statistiques connexes telles que le coût prévu pour le développeur.

Voici un exemple:

$ sloccount .
Creating filelist for experimental
Creating filelist for prototype
Categorizing files.
Finding a working MD5 command....
Found a working MD5 command.
Computing results.


SLOC    Directory   SLOC-by-Language (Sorted)
10965   experimental    cpp=5116,ansic=4976,python=873
832     prototype       cpp=518,tcl=314


Totals grouped by language (dominant language first):
cpp:           5634 (47.76%)
ansic:         4976 (42.18%)
python:         873 (7.40%)
tcl:            314 (2.66%)




Total Physical Source Lines of Code (SLOC)                = 11,797
Development Effort Estimate, Person-Years (Person-Months) = 2.67 (32.03)
 (Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months)                         = 0.78 (9.33)
 (Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule)  = 3.43
Total Estimated Cost to Develop                           = $ 360,580
 (average salary = $56,286/year, overhead = 2.40).
SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
SLOCCount is Open Source Software/Free Software, licensed under the GNU GPL.
SLOCCount comes with ABSOLUTELY NO WARRANTY, and you are welcome to
redistribute it under certain conditions as specified by the GNU GPL license;
see the documentation for details.
Please credit this data as "generated using David A. Wheeler's 'SLOCCount'."
13
marcog

Malheureusement, SLOCCount est un peu long dans la dent et une douleur dans le cou pour les projets PHP, en particulier ceux qui ont un répertoire vendor imbriqué que vous ne voulez pas compter). , il émet un avertissement pour chaque PHP qui n'a pas de balise de fermeture (qui devrait être tous si vous ne mélangez pas HTML et PHP).

CLOC est une alternative plus moderne qui fait tout (modifier: presque tout) SLOCCount, mais prend également en charge un --exclude-dir option et il ne souffre pas du problème de balise de fermeture susmentionné. Il émet également une base de données SQLite à partir de laquelle vous pouvez extraire des mesures assez avancées.

11
Shabbyrobe

Sur les fenêtres à partir d'une ligne de commande:

findstr /R /N "^" *.php | find /C ":"

Merci à cet article .

Pour inclure des sous-répertoires, utilisez \s:

findstr /s /R /N "^" *.php | find /C ":"
6
weston

Les SLOC d'un projet PHP peuvent compter avec sloccount en utilisant quelque chose comme ceci:

find . -not -wholename '*/libraries/*' -not -wholename '*/lib/*' -not -wholename '*/vendor/*' -type f xargs sloccount

Exemple de sortie pour un projet sizey drupal:

[...]
SLOC    Directory   SLOC-by-Language (Sorted)
44892   top_dir         Pascal=33176,php=10293,sh=1423


Totals grouped by language (dominant language first):
Pascal:       33176 (73.90%)
php:          10293 (22.93%)
sh:            1423 (3.17%)

Total Physical Source Lines of Code (SLOC)                = 44,892
Development Effort Estimate, Person-Years (Person-Months) = 10.86 (130.31)
 (Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months)                         = 1.33 (15.91)
 (Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule)  = 8.19
Total Estimated Cost to Develop                           = $ 1,466,963
 (average salary = $56,286/year, overhead = 2.40).
SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
SLOCCount is Open Source Software/Free Software, licensed under the GNU GPL.
SLOCCount comes with ABSOLUTELY NO WARRANTY, and you are welcome to
redistribute it under certain conditions as specified by the GNU GPL license;
see the documentation for details.
Please credit this data as "generated using David A. Wheeler's 'SLOCCount'."
3
Bengt
<?php
passthru('wc -l `find . -iname "*.php"`');
?>

Il suffit de l'exécuter sur votre répertoire actuel où tous les fichiers php sont placés, il affichera les lignes de comptage sur le navigateur.

1
Shahbaz