在 PHP 中执行静态代码分析
开发的重要部分是识别错误并从您的代码库中快速消除它们,我们可以在 PHP 中编写代码或执行静态代码分析来实现这一点。 本篇文章介绍了 lint 模式和一些其他方法如何在 PHP 中执行静态代码分析。
静态代码分析是检测错误、提高一般开发人员生产力、自动完成以及使用强类型 PHP 代码的许多类型相关功能重构代码的一种令人难以置信的方法。 在执行或编译之前,您可以检查源代码以消除语法错误并执行 PHP 编码标准和样式以检测代码中的安全漏洞。
lint 模式是在 PHP 中执行静态代码分析的最佳方法之一,我们将进一步了解 php lint、PHPMD、pfff 和 HHVM,以采用更适合自己需求的方法。 它严重依赖 PHP 的类型系统,您为静态分析提供的信息越多,您获得的结果就越好,在代码中声明类型是添加更多信息的一种方式。
获取精选帖子列表的函数 function exp_funct ($args) {}
可以声明为 function exp_funct (array $args) : array {}
以提供静态代码分析的更多信息。 或者,您可以添加 PHPDoc 注释以在声明函数之前使用类似 // @return array<exp_var>
的内容来声明或初始化函数输入和输出类型。
使用lint模式在PHP中进行静态代码分析
Lint PHP 模式是执行静态代码分析以检查语法错误并识别未使用的变量分配、未进行任何初始化的分配数组、可能的代码风格警告等的最佳方法之一。 您可以通过运行 PHP 来使用 php -l FILENAME 并验证语法,而无需从 shell 或任何其他命令行以 lint 模式执行。
互联网上有许多基于 PHP Lint 的高级和低级静态分析器。 例如,php-sat、PHPStan、PHP-CS-Fixer 和 phan 是一些较高级别的静态分析器; 另一方面,PHP Parser和token get all(原始函数)是一些基于PHP Lint的底层分析器。
您可以将给定的源代码拆分为 PHP 令牌,例如 token_get_all(string $code, int $flags = 0): array,token_get_all
将帮助您使用 Zend 引擎的词法扫描器将给定的代码字符串解析为 PHP 语言令牌。 TOKEN_PARSE 参数标志识别在特定上下文中使用保留字的能力,并帮助返回令牌标识符数组。
此方法返回的每个标记标识符要么是单个字符,要么是一个三元素数组,其中分别包含标记索引、原始标记的字符串内容以及元素 0、1 和 2 中的行号。 你会发现 token_get_all()
的两个例子; 一种是一般用途,另一种是使用保留字在类上执行。
<?php
$userQuota_getToken = token_get_all('<?php echo; ?>');
foreach ($userQuota_getToken as $get_tokenQ) {
if (is_array($get_tokenQ)) {
echo "Line {$get_tokenQ[2]}: ", token_name($get_tokenQ[0]), " ('{$get_tokenQ[1]}')", PHP_EOL;
}
}
?>
// 2nd example on class
/*
$token_quota_source = <<<'code'
class A
{
const PUBLIC = 1;
}
code;
$userQuota_getToken = token_get_all($token_quota_source, TOKEN_PARSE);
foreach ($userQuota_getToken as $get_tokenQ) {
if (is_array($get_tokenQ)) {
echo token_name($get_tokenQ[0]) , PHP_EOL;
}
}
*/
// its output will be something similar
/*
T_OPEN_TAG
T_WHITESPACE
.
.
.
T_CLASS
T_WHITESPACE
T_STRING
.
.
*/
输出结果:
Line 1: T_OPEN_TAG ('<?php ')
Line 1: T_ECHO ('echo')
Line 1: T_WHITESPACE (' ')
Line 1: T_CLOSE_TAG ('?>')
此外,运行时分析器在 lint 模式下工作,由于这种编程语言的动态特性,它在某些方面更有用。 Xdebug 是具有代码覆盖率和功能跟踪器的运行时分析器。
phpweaver 具有 Xdebug 函数跟踪并使用组合的静态/动态方法来执行代码分析。 如果您正在寻找用于生产服务器的静态代码分析器,xhprof 是最好的 lint 模式静态分析器,类似于 Xdebug,但更轻巧并且包含基于 PHP 的界面。
使用 PHPMD 或 PHP Depend Project 在 PHP 中执行静态代码分析
它代表 PHP Mess Detector,是 PHP Depend 的一个衍生项目,旨在成为著名的 Java PMD 工具的等效静态代码分析器。 你可以使用 composer 安装 PHP_Depend,curl -s http://getcomposer.org/installer | php 和 php composer.phar 需要 pdepend/pdepend:2.12.0 或者如果你有任何全局安装的作曲家。
另一方面,PHPMD 比 PHP_Depend 更可取,因为它对用户更友好,并且具有易于配置的前端,用于由 PHP_Depend 测量的原始指标。 它采用给定的源代码(PHP 代码)基础,并且由于它具有简单的工作原理,因此会查找或尝试在该源代码中查找潜在的错误或注意事项。
它可以轻松检测错误和语法错误、过于复杂的表达式、未使用的属性、方法、参数和次优代码。 作为一个成熟的 PHP 项目和静态代码分析器,PHP Mass Detector 提供了一个庞大的预定义规则库来分析 PHP 源代码。
// Type phpmd [filename|directory] [report format] [ruleset file]
hassan@jiyik ~ $ phpmd PHP/Depend/DbusUI/ xml rulesets/codesize.xml
<?xml version="1.0" encoding="UTF-8" ?>
<pmd version="0.0.1" timestamp="2009-12-19T22:17:18+01:00">
<file name="/projects/pdepend/PHP/Depend/DbusUI/PHPMD.php">
<violation beginline="54"
endline="359"
rule="TooManyProperties"
ruleset="Code Size Rules"
package="PHP_Depend\DbusUI"
class="PHP_Depend_DbusUI_ResultPrinter"
priority="1">
This class has too many properties; consider refactoring it.
</violation>
</file>
</pmd>
输出结果如下:
This class has too many properties; consider refactoring it.
可以通过键入 phpmd [文件名|目录] [报告格式] [规则集文件]
来激活或使用 PHP Mess Detector 的命令行用法,并且可以将文件/目录名称传递给 PHPMD 作为 PHP 源的容器 用于分析的代码。 codesize.xml 或规则集参数看起来像一个文件系统参考,因为它的 Phar 分布在其存档中包含规则集文件。
此外,它使 PHP 程序员能够使用缩短的名称或引用来引用内置规则集,如 phpmd Depend XML codesize。 PHPMD 的命令行界面还接受可选参数,如 --min-priority
、--report-file
、--suffixes
、--strict
等等。
您可以应用 ~ $ phpmd /path/to/source text codesize
配置,方法是使用针对测试中的源代码应用的多个规则集,并使用设置的名称启用对其 CLI 工具的调用。 此外,它允许程序员进行深入配置,将自定义规则集文件与内置规则集混合使用,~ $ phpmd /path/to/source text codesize,/my/rules.xml
命令就是一个很好的例子 指定您的自定义规则集以分析源代码。
使用 pfff 工具在 PHP 中执行静态代码分析
作为一组 API 和工具,它可以执行静态代码分析以索引、搜索、导航、可视化、重构源代码以及保持样式的源到源 PHP 代码转换。
编译安装pfff很容易; 但是,它会生成复杂格式的结果,例如 go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl 或 login-now.php:7:4: CHECK: Unused Local variable $title。 您可以使用 $ ~/sw/pfff/scheck ~/code/github/sc/ 访问 GitHub 上的 pfff。
此外,您可以通过复制项目目录中的 commons/ 和 parsing_php/ 目录并添加递归 make,将解析库嵌入到您自己的 OCaml 应用程序中; 最后,将应用程序与 parsing_php/parsing_php.cma & commons/commons.cma
库链接。 此外,请观察 pfff/demos/Makefile 以更好地理解,编译源代码后,您可以使用以下内容测试 pfff:
$ cd demos/
$ ocamlc -I ../commons/ -I ../parsing_php/ \
../commons/commons.cma ../parsing_php/parsing_php.cma \
show_function_calls1.ml -o show_function_calls
$ ./show_function_calls foo.php
之后,您必须能够根据 Facebook 档案中 pfff 项目中 show_function_calls1.m1 中的代码,在 stdout 上看到有关 foo.php 中函数调用的一些有用信息。 pfff 解析器非常高效,您可以在 phpbb 网站上对其进行测试。
// source code of pfff command-line
$ cd /tmp
$ wget http://d10xg45o6p6dbl.cloudfront.net/projects/p/phpbb/phpBB-3.0.6.tar.bz2
$ tar xvfj phpBB-3.0.6.tar.bz2
$ cd <pfff_src_directory>
$ ./pfff -parse_php /tmp/phpBB3/
然后 pfff 程序应该遍历所有源代码文件(.php 源文件)并在每个源文件上运行解析器并输出一些统计信息,例如:NB total files = 265; perfect = 265; =========> 100% and nb good = 183197, nb bad = 0 =========> 100.000000%
这意味着 pfff 能够解析 100% 的 PHP 源代码。
作为命令行程序,它具有不同的命令,如 pfff 来测试 PHP 语言解析器。 您可以使用 scheck 来查找错误,它的工作方式类似于 Emacs 标记生成器的 lint 和 stag,比其他任何工具都更加精确。
sgrep 是一个合成的 grep,可以很容易地找到精确的代码模式,spatch 是一个语法补丁,可以很容易地重构 PHP 代码,还有 codemap、pfff_db、codegraph 和 codequery,这些都是最新添加到 pfff 工具对一组源文件执行全局分析或查询有关 PHP 代码库结构的信息。
使用 HHVM 在 PHP 中执行静态代码分析
它具有内置的 Proxygen 和 FastCGI 服务器类型支持,可以成为完美的静态代码分析器之一。 HHVM 被称为功能齐全的 Web 服务器,直接内置了 Proxygen,其易用性和处理源代码的特性使其非常适合静态代码分析。
它服务于快速 Web 请求,并提供相当于 FastCGI 和 Nginx 组合的高性能 Web 服务器。 您可以执行 hhvm -m server -p 8080
以在服务器模式下运行 HHVM 时使用 Proxygen,并且可以通过命令行配置设置端口:hhvm.server.port=7777
,或将 -d hhvm.server.port=7777
放入您的 服务器 .ini 文件。
您可以使用 -d hhvm.server.type=proxygen
命令来定义 Proxygen 服务器类型,而无需明确指定它(Proxygen 是默认值)。 初始化脚本 HHVM 包默认以 FastCGI 模式启动,需要调整配置才能作为服务器自动启动。
以下是在命令行中使用不同的可自定义选项(server.ini 或 -d 选项)配置 HHVM 包的示例。 请记住,其中一些配置选项是可选的,因为它们是默认值,但它们可以帮助向用户提供更多信息或显示插图。
// initialize a server port
hhvm.server.port = 60
// the default server type is `proxygen`
hhvm.server.type - proxygen
hhvm.server.default_document = source.php
hhvm.error_document404 = source.php
hhvm.server.source_root = /edit/source/php
使用可选的配置选项有利于明确文档目的,而 hhvm.server.source_root
和 hhvm.server.port
最有可能需要明确的值。 HH 虚拟机是开源的,用 Hack 编写,并使用 JIT(即时)编译来实现卓越的性能,同时保持出色的开发灵活性。
HHVM 二进制文件启动的默认目录是 default_document,您可以根据您的服务器更改该目录。 在您的 PHP 项目中将 HHVM 安装到操作系统后,您可以使用 sudo update-rc.d hhvm defaults
和 sudo service hhvm restart
命令将 HHVM 设置为在启动时作为服务器启动。
相关文章
如何在 PHP 中获取时间差的分钟数
发布时间:2023/03/29 浏览次数:183 分类:PHP
-
本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。