подсчет строк в PHP-проекте [закрыто]



вы знаете какой-нибудь инструмент, который может подсчитать все строки кода из проекта PHP?

682   7  

7 ответов:

в операционной системе POSIX (например, Linux или OS X) вы можете записать в свою оболочку Bash следующее:

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

это будет считать строки во всех php-файлах в текущем каталоге, а также подкаталогах. (Обратите внимание, что эти одиночные "кавычки" являются обратными, а не фактическими одиночными кавычками)

Я сделал себе небольшой скрипт, чтобы сделать это в одном из моих проектов. Просто используйте следующий код на странице php в корне вашего проекта. Скрипт будет выполнять рекурсивную проверку вложенных папок.

<?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;  
}

SLOCCount Это удивительный инструмент, который создает отчет о количестве строк для большого количества языков. Он также идет дальше, создавая другие, связанные статистические данные, такие как ожидаемая стоимость разработчика.

вот пример:

$ 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 = ,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'."

к сожалению, SLOCCount немного длинен в зубе и болит в шее для PHP-проектов, особенно тех, которые имеют вложенный vendor каталог, который вы не хотите считать. Кроме того, он выдает предупреждение для каждого файла PHP, который не имеет закрывающего тега (который должен быть всем из них, если вы не смешиваете HTML и PHP).

CLOC является более современной альтернативой, которая делает все (edit: почти все) SLOCCount делает, но также поддерживает и это не страдает от вышеупомянутой проблемы с закрытием тега. Он также создает базу данных SQLite, из которой вы можете извлечь некоторые довольно продвинутые метрики.

на windows из командной строки:

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

спасибо в этой статье.

чтобы включить подкаталоги, используйте \s :

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

SLOCs PHP-проекта можно считать с sloccount использовать что-то вроде этого:

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

пример вывода для проекта 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 = ,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'."
<?php
passthru('wc -l `find . -iname "*.php"`');
?>

просто запустите это в вашем текущем каталоге, где размещены все файлы php, он будет отображать количество строк в браузере.

Comments

    Ничего не найдено.