月下博客

使用php codesniffer和mess detector

写代码的时候,难免会出现各种bug。为了减少bug,常用的手段有:拼写检查、code review等。

如果使用vim编辑器,在其配置文件.vimrc中增加该选项能够对拼写进行检查,一定程度上减小拼写错误:

set spell

然而代码中,很少直接用一个完整的单词做变量或者方法名。该配置对写文章等有帮助,用在写代码上作用有限。code review能够极大的降低bug,可惜需要额外的人力与时间。对于大部分程序员来说,提交之前能够diff一下查看改动的代码就已经很难得了。review适合于人员充足,对质量要求严格的团队。

有没有一种方法,能够自动检测语法、潜在bug等呢?必须是有的,否则phpstorm等卖点何来?!对于php开发来说,编写的时候就做到规范高质量的代码,需要三步:语法检测、编码规范和质量检测。

语法检测

php在执行代码之前,首先会进行语法分析。没有错误再进行编译和执行。如何检测一个php文件有没有语法错误呢?在命令行下,使用该命令:

php -l filename.php

如果有错误,该命令能够将错误详细输出来。写完代码后,使用该命令检查一下php文件有无语法问题,是一个好习惯。

php -l 只能一个个的检查文件,如何批量的检查php文件的语法问题?可以使用下列命令:

find . -name "*.php" | xargs -n 1 -P N php -l

其中-P N中的N是进程数,在多核情形下,让N>1能够提高效率。

编码规范

每个人都有自己的代码风格,这是完全没有问题的。对于团队开发,协商好规范再开发,能够保持项目编码风格的一致性。对于php开发,目前流行的开发规范主要是psr。如何知道自己写的代码是否遵循定义的规范呢?

可以使用php codesniffer这个工具。php codesniffer是pecl的一个包,安装之后利用phpcs这个可执行文件即可对违背编码规范的代码做出提示,例如:

phpcs a.php

该命名一个可能的输出为:

FILE: /var/www/nsnmf/common/models/Submission.php
----------------------------------------------------------
FOUND 0 ERRORS AND 2 WARNINGS AFFECTING 2 LINES
----------------------------------------------------------
  60 | WARNING | Line exceeds 120 characters; contains 138 characters
 187 | WARNING | Line exceeds 120 characters; contains 390 characters
----------------------------------------------------------

Time: 52ms; Memory: 5.25Mb

输出内容取决于phpcs的配置。通过该命令,我们可以清晰的看到文件中编码不规范的地方并改进,使得项目的编码规范统一。

质量检测

质量检测主要是对程序中潜在的性能问题、bug等进行检测。例如定义了未使用的变量,读取未声明的变量等。语法检测使得代码能够运行,质量检测则让代码能更稳定健壮的运行。通过质量检测,可以在运行前即发现代码问题,从而提高代码的线上运行稳定率。

php可以使用mess detector来对代码进行检测。安装了mess detector之后,使用phpmd对代码进行检测:

phpmd a.php text ruleset.xml

一个可能的输出为:

$ phpmd a.php text .vim/phpmd-ruleset.xml  
/home/tlanyan/a.php:12  Avoid unused local variables such as '$cd'.

文件中我们使用了未定义的变量$cd,通过了语法检测,但是被质量检测发现了。

通过以上三步,能够让我们的代码风格统一,并且健壮。以下是centos下的配置和使用过程:

1. 安装

语法检测的功能php自带,无需额外安装。需要安装的是codesniffer和mess detector。

安装codesniffer

官方网站: http://pear.php.net/package/PHP_CodeSniffer/redirected

项目源代码: https://github.com/squizlabs/PHP_CodeSniffer

我们使用pear工具来安装,命令如下:

yum install php-pear  
pear install PHP_CodeSniffer

通过这两步,我们即可直接使用phpcs来做编码规范检测。但是此时使用的是默认配置,可以通过phpcs –config-show看到输出为空。需要自定义规则,可以将 /usr/share/pear-data/PHP_CodeSniffer文件夹下的CodeSniffer.conf.dist文件重命名为CodeSniffer.conf,并适当修改其内容以符合要求。再次运行phpcs命令,将会看到使用自定义配置后的效果。

安装mess detector

官方网站: http://phpmd.org/

mess detector的安装非常简单,直接下载下来即可:

wget -O /usr/bin/phpmd -c 'http://static.phpmd.org/php/latest/phpmd.phar' 

phpmd必须指定一个ruleset。内置的有cleancode, codesize等。自定义ruleset也是非常简单,可以参考官网的教程。

通过这几步,已经搭建了一套完整的检测环境。接下来就是将这些工具运用到实践中了。

2. 使用vim syntastic

上面的过程稍微有点美中不足:每次编辑完文件,需要退出之后再一一运行命令。有没有可能这些都是自动的完成呢?

答案是肯定的。使用vim的syntastic插件,即可帮我们自动完成上述的一些列步骤!

如果你使用vundle来管理vim的插件,只需在 .vimrc 中添加下列命令:

Bundle 'scrooloose/syntastic'

然后运行 BundleInstall 即可将syntastic插件安装。接着加入一下配置到.vimrc,则上述过程将在文件保存的时候自动触发:

" syntastic conf  
set statusline+=%#warningmsg#  
set statusline+=%{SyntasticStatuslineFlag()}  
set statusline+=%*

let g:syntastic_always_populate_loc_list = 1  
let g:syntastic_auto_loc_list = 1  
let g:syntastic_check_on_open = 1  
let g:syntastic_check_on_wq = 0

let g:syntastic_php_phpcs_args = "--standard=~/.vim/phpcs-ruleset.xml"
let g:syntastic_php_phpmd_post_args="~/.vim/phpmd-ruleset.xml"