本文目录导读:

这个问题挺有意思的,我理解你可能是想问:在一个PHP项目里,如何统计某个特定功能/函数/代码片段(你戏称为“马赛回旋”)的使用频率?
“马赛回旋”是足球术语(齐达内的招牌过人动作),放到代码语境里,通常指某种花哨但实用的技巧性写法,
- 某个巧妙的递归/闭包/魔术方法
- 一段绕来绕去但能跑通的“祖传代码”
- 某个被到处复制的工具函数
下面按“你到底想统计什么”分几种情况说。
统计某个PHP函数/方法的调用频率
静态分析(不运行代码)
用工具扫描代码库,找出某个函数被调用了多少次。
推荐工具:
- PHPStan / Psalm:自定义规则可以统计
- PhpParser (nikic/php-parser):自己写脚本遍历AST
示例:统计 str_replace 在整个项目中出现次数
use PhpParser\ParserFactory;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitorAbstract;
use PhpParser\Node;
$parser = (new ParserFactory)->createForNewestSupportedVersion();
$traverser = new NodeTraverser();
$count = 0;
$traverser->addVisitor(new class($count) extends NodeVisitorAbstract {
public function __construct(public int &$count) {}
public function enterNode(Node $node) {
if ($node instanceof Node\Expr\FuncCall
&& $node->name instanceof Node\Name
&& $node->name->toString() === 'str_replace') {
$this->count++;
}
}
});
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator('src')) as $file) {
if ($file->getExtension() !== 'php') continue;
$ast = $parser->parse(file_get_contents($file));
$traverser->traverse($ast);
}
echo "str_replace 被调用 $count 次\n";
运行时统计(真实调用频率)
如果想知道“运行时到底被调用了多少次”:
- Xdebug + 代码覆盖率:
xdebug_start_code_coverage()能看到每行执行次数 - XHProf / Tideways:函数级调用次数统计
- OpenTelemetry / SkyWalking PHP:APM方案,能看到函数级指标
Xdebug 示例:
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); // ... 跑你的业务 $data = xdebug_get_code_coverage(); // $data[文件名][行号] = 执行次数
日志埋点(最简单粗暴)
在“马赛回旋”函数入口加一行:
function 马赛回旋(...$args) {
static $count = 0;
$count++;
error_log("马赛回旋 called {$count} times");
// ...
}
或者用 Redis 原子自增:
Redis::incr('stats:马赛回旋');
统计某段“代码模式”的出现频率
比如你想找项目里有多少处写了这种“回旋”式写法:
$a = $b ?: ($c ?: ($d ?: 'default'));
思路:
- 正则匹配(粗糙但快)
- AST 匹配(精确)
- 用 Rector 写自定义规则统计
正则示例:
grep -rP '\?:.*\?:.*\?:' src/ | wc -l
统计 Git 层面的“使用频率”
想知道这段代码是谁、什么时候、改了多频繁:
# 某函数/关键字在提交历史中的出现频率 git log -S "马赛回旋" --oneline | wc -l # 某文件的修改频率 git log --follow --format="%ad" --date=short src/马赛回旋.php | sort | uniq -c
配合 git-of-theseus、code-maat 可以做可视化。
马赛回旋”是某个业务动作
比如电商里用户“加购→删掉→再加购”这种回旋操作,
- 在业务事件里打点(埋点SDK / 消息队列)
- 用 ClickHouse / Doris 做行为分析
- 定义窗口函数统计“N分钟内反复操作”
SQL思路:
SELECT user_id, COUNT(*) AS 回旋次数 FROM user_events WHERE event = 'add_to_cart' AND ts > NOW() - INTERVAL 1 HOUR GROUP BY user_id HAVING COUNT(*) >= 3;
给你的具体建议
你说的“马赛回旋”到底指什么?如果是:
| 场景 | 推荐方案 |
|---|---|
| 某个PHP函数被调用多少次 | PhpParser静态扫描 + Xdebug动态统计 |
| 某段代码模式出现多少处 | Rector 自定义规则 / AST遍历 |
| 运行时真实热点 | XHProf / Tideways / OpenTelemetry |
| 代码随时间演变 | git log -S / code-maat |
| 业务行为频率 | 埋点 + OLAP 查询 |
如果你能说一下“马赛回旋”具体指哪段代码或哪种模式,我可以给你写一个能直接跑的统计脚本。