Loading... # [PHP开发必备工具](https://blog.p2hp.com/archives/3618) 在本文中,将介绍在目前软件工程中经常用到的持续集成概念,并且会介绍在PHP开发中,如何能用好PHP目前开源的一些持续集成管理工具,去管理好项目。 持续集成的概念 持续集成的概念是在现代软件工程中提出的,最早见于敏捷开发方法论中,大师Martin Fowler对持续集成是这样定义的:持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。 下面介绍PHP中的持续集成工具: PHPUNIT 首先,PHPUNIT是PHP中的单元测试利器,项目地址在:http://www.phpunit.it。它 能自动运行你编写的单元测试代码,并给出是否通过的结果。安装步骤如下,可以使用PHP中的PEAR安装: sudo apt-get install php5-curl php-pear php5-dev sudo pear upgrade pear sudo pear channel-discover pear.phpunit.de sudo pear channel-discover components.ez.no sudo pear channel-discover pear.symfony-project.com sudo pear install phpunit/PHPUnit 之后,就可以在命令行下,以如下格式执行phpunit: Phpunit 单元测试的php文件名.php 此外,还可以执行如下命令,生成单元测试的覆盖报告: phpunit --coverage-html ../CodeCoverage 这将在指定的目录中生成单元测试的覆盖报告,比如这个例子中,将在目录CodeCoverage中生成单元测试覆盖报告,如下图: PHP开发必备 PHP持续集成工具介绍(上) ▲点击看大图 如果点上图的每一个PHP文件,还可以具体看到每个文件的单元测试覆盖情况,如下图: PHP开发必备 PHP持续集成工具介绍(上) ▲点击看大图 从上图中,可以看到每个PHP文件中,调用的方法的单元测试覆盖情况,还可以看到具体哪些代码行是已经单元测试覆盖过,哪些没有覆盖过(绿色表示已经覆盖,橙色表示还没覆盖),如下图: PHP开发必备 PHP持续集成工具介绍(上) ▲点击看大图 PHP CodeSniffer PHP CodeSniffer是一个PHP的代码风格检测器,它根据预先设定好的PHP编码风格和规则,去检查应用中的代码风格情况,内置了ZEND,PEAR的编码风格规则,当然开发者也可以进行自定义。项目的地址在:http://pear.php.net/package/PHP_CodeSniffer/redirected,安装方法如下: sudo pear install PHP_CodeSniffer phpcs --standard=Zend c:\phpcode 其中phpcs –standard后指定了使用Zend的建议代码风格标准进行检查,最后一个参数是要检查的PHP文件所在的目录。运行后,检查的一个效果图如下图所示: PHP CodeSniffer ▲点击查看大图 PHP Depend PHP Depend(http://pdepend.org/)是一个PHP中静态代码分析的工具。它可以用来检查你的PHP项目中的代码规模和复杂程度。安装方法如下: sudo pear channel-discover pear.pdepend.org sudo pear install pdepend/PHP_Depend-beta 使用的一个例子如下: pdepend --jdepend-xml=../jdepend.xml --jdepend-chart=../dependencies.svg --overview-pyramid=../overview-pyramid.svg 上面会生成一个XML文件,两个SVG的图形文件。其中XML文件说明了项目中各PHP文件的互相依赖调用(引用)情况及每个方法、函数,类的代码行,一个例子如下: <?xml version=”1.0” encoding=”UTF-8”?> <metrics noc=”3” nof=”0” noi=”0” nom=”6”> <package name=”+global” noc=”17” nof=”0” noi=”0” nom=”237”> <class name=”data_container”nom=”55”> <file name=”/home/case-study/libs/data/container.php”/> </class> <class name=”data_download” nom=”10”> <file name=”/home/case-study/libs/data/download.php”/> </class> 其中的noc含义是类的代码的行书,nof为函数的代码行数,noi为接口代码行数,nom为方法method代码行数。 接下来我们来看下产生的一张SVG图,该图如下所示: PHP CodeSniffer 这张图的反映了项目中包的依赖性度量情况。其基本理论来源于Robert C. Martin的论文(http://www.objectmentor.com/resources/articles/oodmetrc.pdf)中所介绍的关于软件中模块依赖性和稳定性的度量。其中,提到了如下概念: Afferent Couplings (Ca) 依赖于被分析package的其他package的数量,用于衡量pacakge的职责。 简单来说,即有多少其他的包或模块调用了被分析的包或模块。 Efferent Couplings (Ce) 被分析package的类所依赖的其他package的数量,用于衡量package的独立性。 即它调用了多少其他包。 Abstractness (A) 被分析package中的抽象类和接口与所在package所有类数量的比例,取值范围为0-1。如果该值为0,证明包中没任何抽象类,有的只是具体实现逻辑方法的类,如果该值为1,则包中只有抽象类或接口了 Instability (I) I=Ce/(Ce+Ca),用于衡量package的不稳定性,取值范围为0到1。I=0表示最稳定,I=1表示最不稳定。 Distance (D) 用于衡量package在稳定性和抽象性之间的平衡。可以看到,最理想的情况是A+I越趋近1的,这样能获得抽象性和稳定性的最佳平衡。 此外,介绍php depend中生成的另外一张图的含义,图片如下: PHP CodeSniffer 在这张图中,最上面的ANDC表示继承其他类的平均数目,即项目中有多少类是继承其他的类;AHH是继承其他类的层次数。CALLS是方法被调用的总的次数,FANOUT是类所引用的类型数目。而CYCLO是圈复杂度(关于圈复杂度的解析,请参考(http://en.wikipedia.org/wiki/Cyclomatic_complexity)。LOC是代码行数,NOM是项目中的方法的数目,NOC为项目中类的数目,NOP为项目中包的数目。 根据上图中标明的除法规则,可以计算出相关的数据。更多的请参考php depend手册(http://pdepend.org/documentation/handbook/reports/overview-pyramid.html)的详细解析。 在上一篇文章中,我们为大家介绍了一些PHP持续集成工具,在本文中,我们将介绍继续介绍PHP中的持续集成工具。 持续集成的概念 持续集成的概念是在现代软件工程中提出的,最早见于敏捷开发方法论中,大师Martin Fowler对持续集成是这样定义的:持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。 PHP MESS DECTOR PHP MESS DECTOR(简称PMD,项目地址http://phpmd.org/),是基于pdepend的结果进行分析,分析出一旦你的PHP项目超过了pdepend中各具体指标值的规定,从而发出警告提示信息,安装方法如下: sudo pear channel-discover pear.phpmd.org sudo pear channel-discover pear.pdepend.org sudo pear install --alldeps phpmd/PHP_PMD 使用方法为: phpmd . html codesize,unusedcode,naming,design --reportfile ../messdetector.html --exclude Tests/ 上面这个命令含义为,使用pdepend中的4个规则codesize,unusedcode,naming,desgin去检查项目的代码,但除了Tests目录不作检查,检查结果生成HTML的格式,保存在/messdetector.html中,结果如下: PHP开发必备 PHP持续集成工具介绍(下) ▲点击查看大图 PHP COPY PASTE DETECTOR Php copy paste detector(https://github.com/sebastianbergmann/phpcpd)是重构的一个好工具,它用来发现你的项目中的重复代码。安装方法如下: sudo pear channel-discover pear.phpunit.de sudo pear channel-discover components.ez.no sudo pear install phpunit/phpcpd 注意,必须先安装phpunit。运行方法如下图: PHP开发必备 PHP持续集成工具介绍(下) PHP DEAD CODE Detector php dead code detector(https://github.com/sebastianbergmann/phpdcd)是一个检查你的项目中有哪些代码是从来没被调用过的,比如类,方法编写后再没被调用过,这是一个去掉“坏味道”代码的最佳实践,可以增强系统的可维护性。安装如下: sudo pear channel-discover pear.phpunit.de sudo pear channel-discover components.ez.no sudo pear install phpunit/phpdcd-beta 运行方法下图: PHP开发必备 PHP持续集成工具介绍(下) 综合持续集成工具 Jenkins 有了上面的各类工具,用户可以在PHP中进行持续集成构建的工作,但还可以使用一款综合的持续集成工具Jenkins(http://jenkins-ci.org/)进行(注:Jenkins其实就是原先的构建工具Hudson,只不过现在改了名称)。这款持续集成工具是个持续构建服务器,包含了上述提到的各种PHP持续构建工具的功能,安装好后,能做到每天持续构建,并将构建的结果通知用户。下面对其进行简单介绍。 Jenkins可以使用windows下的计划任务,LINUX下的SHELL以及ANT或者MAVN去进行构建项目,本文以使用ANT为例进行说明,首先必须安装JAVA中的ANT。编写ANT文件如下: <project name="Test" default="build" basedir="."> <property name="output" location="${basedir}/buildOutput/"/> <target name="init"> <mkdir dir="${output}"/> <mkdir dir="${output}/phpcs/"/> <mkdir dir="${output}/pdepend/"/> </target> <target name="build" depends="init, test, phpcs, phpmd, phpcpd, pdepend"> </target> <target name="test"> <exec executable="phpunit" failonerror="true"> <arg line="--coverage-clover ${output}/CodeCoverage/clover.xml --coverage-html ${output}/CodeCoverage/ ."/> </exec> </target> <target name="phpcs"> <exec executable="phpcs"> <arg line="--report=checkstyle --report-file=${output}/phpcs/checkstyle.xml --standard=Zend ${basedir}" /> </exec> </target> <target name="phpmd"> <exec executable="phpmd"> <arg line=" . xml codesize,unusedcode,naming,design --reportfile ${output}/messdetector.xml --exclude Tests/ " /> </exec> </target> <target name="phpcpd"> <exec executable="phpcpd"> <arg line=" --log-pmd ${output}/phpcpd.xml . " /> </exec> </target> <target name="pdepend"> <exec executable="pdepend"> <arg line=" --jdepend-xml=${output}/pdepend/jdepend.xml --jdepend-chart=${output}/pdepend/dependencies.svg --overview-pyramid=${output}/pdepend/overview-pyramid.svg --ignore=Tests/ . " /> </exec> </target> </project> 熟悉ANT的读者应该知道,这里其实是调用了以上说的各个PHP持续集成工具而已。 接下来,是安装Jenkins,到Jenkins的官网去下载相符合的操作系统版本,然后就可以按照指引安装,本文以在Ubantu上的安装方法为例说明: wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add – 在/etc/apt/sources.list文件最后增加如下这行: deb http://pkg.jenkins-ci.org/debian binary/ sudo apt-get update sudo apt-get install jenkins 之后就可以安装成功了,可以通过http://localhost:8080/ 去访问Jenkins了,初始界面如下图: PHP开发必备 PHP持续集成工具介绍(下) Jenkins的设置 Jenkins的设置比较复杂,在这里不一一详细论述。但这里稍微提下设置的基本方法。只需要点上图中的“Manage Jenkins”链接,再点“Configure System”则可进入设置面板,其中你可以设置相关的权限设置,也可以设置SMTP用来通知每次的构建成功与否的信息。此外,需要设置Jenkins中的插件设置,要打开相关的插件设置开关,比如使用Git做版本控制工具的,则要设置Git插件为允许状态。设置的步骤很简单,选择“plugin”,点“Install”即可安装,安装后要重新启动Jenkins。 我们需要安装一系列的插件去实现php的持续集成,比如安装Clover(https://wiki.jenkins-ci.org/display/JENKINS/Clover+Plugin)去图形化显示phpunit的单元测试覆盖率,安装Checkstyle(https://wiki.jenkins-ci.org/display/JENKINS/Checkstyle+Plugin)去显示PHP CodeSniffer的运行结果,也要安装PMD,而Jdepend(https://wiki.jenkins-ci.org/display/JENKINS/JDepend+Plugin)用来显示PHP Depend的结果。 在完成基本设置后,我们可以首先新建立一个Job,点“New Job”链接,给Job命名,之后,我们可以按照http://jenkins-php.org/一文中的教程进行设置,之后就可以运行构建了,下面是两个典型的构建运行图: PHP开发必备 PHP持续集成工具介绍(下) PHP开发必备 PHP持续集成工具介绍(下) 可以看到,Jenkins的每次构建,都能综合运用了本文所谈到的各样php集成工具,十分方便,而且能提供十分丰富的图形报表。 总结 持续集成应该成为你日常项目管理运行维护的重要步骤,通过每天构建项目,能达到敏捷软件工程学中的最佳实践,提高系统的可靠性,减少系统潜在的bug,由于篇幅所限,更多的持续集成工具用法在以后的文章中将会详细论述,读者可参考各工具的参考手册进行学习。 最后修改:2023 年 08 月 09 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏