本文目录导读:

- 静态代码分析(grep / 正则)
- 使用PHP Tokenizer(推荐)
- 使用PHP_CodeSniffer / PHPStan(更高级)
- 数据库/日志监控(运行时统计)
- 快速对比:方法优缺点
- 扩展需求:统计“马赛回旋”类似动作
- 输出格式建议
在PHP项目中统计“马赛回旋”(通常指代码中的某个函数、方法或特定字符串,如marseille_turn、spinMove()等)的使用频率,可以通过以下几种方法实现:
静态代码分析(grep / 正则)
最简单的方式,用命令行工具扫描代码库。
命令示例(Linux/Mac):
# 统计包含"marseille"或"马赛回旋"的文件数量
grep -r "marseille\|马赛回旋" --include="*.php" /path/to/project | wc -l
# 统计具体函数调用次数(如:spinMove())
grep -r "spinMove(" --include="*.php" /path/to/project | wc -l
缺点:无法区分注释、字符串、实际调用,容易误报。
使用PHP Tokenizer(推荐)
PHP官方扩展token_get_all()可以解析PHP代码结构,准确区分注释、字符串和实际代码调用。
示例脚本 count_usage.php:
<?php
function countFunctionUsage($dir, $targetFunction) {
$count = 0;
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir)
);
foreach ($iterator as $file) {
if ($file->getExtension() !== 'php') continue;
$code = file_get_contents($file->getPathname());
$tokens = token_get_all($code);
foreach ($tokens as $index => $token) {
// 只匹配函数调用,不匹配函数定义
if (is_array($token) && $token[0] === T_STRING
&& $token[1] === $targetFunction
&& $tokens[$index+1] === '('
&& $tokens[$index-1][0] !== T_FUNCTION) {
$count++;
}
}
}
return $count;
}
$usageCount = countFunctionUsage('/path/to/your/project', 'marseille_turn');
echo "马赛回旋函数使用次数:$usageCount\n";
说明:
- 该脚本会递归扫描所有
.php文件。 - 通过检查
T_STRING+ 判断是函数调用。 - 排除
function定义(避免统计定义本身)。
使用PHP_CodeSniffer / PHPStan(更高级)
这些工具内置了AST解析,可以精准统计并支持规则制定。
示例(PHPStan + 自定义Rule):
// 自定义规则:统计某个函数调用次数
class CountMarseilleRule implements PHPStan\Rules\Rule {
public function getNodeType(): string {
return PhpParser\Node\Expr\FuncCall::class;
}
public function processNode(Node $node, Scope $scope): array {
if ($node->name->toString() === 'marseille_turn') {
// 记录统计(可输出到日志)
}
return [];
}
}
数据库/日志监控(运行时统计)
马赛回旋”是业务操作(如用户动作),可以在调用时埋点:
// 在函数入口添加日志
function marseille_turn() {
\Log::info('马赛回旋被调用', ['path' => __FILE__, 'line' => __LINE__]);
// 业务逻辑...
}
然后通过日志分析工具(ELK、Splunk)统计频率。
快速对比:方法优缺点
| 方法 | 准确度 | 性能 | 适用场景 |
|---|---|---|---|
| grep | 低 | 快 | 快速初步排查 |
| Tokenizer | 高 | 中等 | 代码审计、准确统计 |
| PHPStan | 高 | 慢 | 深度静态分析 |
| 日志埋点 | 准确(运行时) | 取决于日志量 | 线上监控 |
扩展需求:统计“马赛回旋”类似动作
马赛回旋”表示一种模式(如 旋转+传球),可能需要结合语义分析(如AST遍历后匹配模式):
// 检测 if 内连续两个函数调用
if ($tokens[$i] === 'rotate' && $tokens[$i+1] === 'pass') {
echo "发现潜在的马赛回旋代码段";
}
输出格式建议
- 生成报表:
CSV、JSON或直接命令行输出。 - 可按模块(目录)分组统计。
示例输出:
文件:src/attack.php - 次数:5 文件:src/midfield.php - 次数:8 总使用次数:13
选择方法时,考虑项目规模、统计精度需求以及是否涉及线上监控,对于一般项目,Tokenizer脚本是性价比最高的选择,如果需要长期监控,建议集成到CI流程中。