本文目录导读:

这个问题挺有意思的,我理解你可能是想问:在一个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 查询 |
如果你能说一下“马赛回旋”具体指哪段代码或哪种模式,我可以给你写一个能直接跑的统计脚本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播