在一个PHP项目计数线

你知道任何可以计算PHP项目的所有代码行的工具吗?

在POSIX操作系统(例如Linux或OS X)上,您可以将以下内容写入Bash shell:

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

这将统计当前目录中的所有php文件中的行以及子目录。 (请注意,这些单引号是反引号,而不是单引号)

我在自己的一个项目中做了一个小小的脚本。 只需在您的项目的根目录下的php页面上使用以下代码即可。 该脚本将对子文件夹进行recursion检查。

 <?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选项,并且不会遇到上述的closures标签问题。 它还会发出一个SQLite数据库,您可以从中提取一些相当先进的指标。

在命令行窗口上:

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

感谢这篇文章 。

要包含子目录,请使用\s

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

PHP项目的SLOC可以用sloccount来计算,如下所示:

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

一个大的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文件,就会在浏览器上显示count行。