подсчет строк в проекте PHP

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

В операционной системе 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: joel@engrenage.biz */ $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 = $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'." 

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

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

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

 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 = $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'." 
 <?php passthru('wc -l `find . -iname "*.php"`'); ?> 

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