动态跟踪每个函数调用

时间:2011-09-21 09:22:21

标签: php

我想知道,你可以创建一个函数或其他东西,在网站上寻找其他函数调用吗?我认为,如果有一个母版页,你可以把它包含在最顶层,它应该在网站上工作。

但我不知道该怎么做。

有点像debug_backtrace();,但是全球性的。换句话说,一个函数可以执行在此函数之后调用的函数。

嗯,我知道你可以用特定的call_user_func();做到这一点,因此跟踪所发生的一切,但是......任何动态的方式?

提前致谢!

目标

这样做的目的是动态保持被调用函数链。所以在某些时刻,例如,我需要从链中的第3个函数返回一个值,所以我可以使用类似$calls[2]; // the stored returned value or an array containing info about function + returned value的东西来检索它。

它会在每次调用时将函数数据添加到链中,其中第一个调用是$key = 0。因此,出于调试目的,当我的函数连续失败 x 函数时,我很想知道有关先前调用的函数的信息,可能会返回错误的值,导致某些部分出错上。

3 个答案:

答案 0 :(得分:1)

我不相信有,我怀疑它是否会起作用并且会有用。函数依次调用其他函数,甚至是内部函数。即使是日志记录功能本身也是功能,因此您最终会获得大量信息,您几乎无法做任何相关的信息。如果存在这样的解决方案(可能),它将不会在PHP本身中开发,而是由PHP加载或编译的模块。

如果要将方法调用记录到类实例,可以进行一些挂钩。您可以创建一个实现__call的类。然后,对于要记录的实例,将该实例分配给日志类的实例,并将该日志类实例分配给存储原始类的变量。

然后,每个方法调用都会定向到您的班级,您可以在调用原始方法之前记录每个调用。

答案 1 :(得分:1)

看起来你正在寻找一些AOP技术。如果未设置某个(全局)标志(显示跟踪),则可以编写已编织的代码以立即返回,否则打印回溯。

PHP不直接支持AOP,但您可以修补PHP内核或使用工具根据AOP编织创建(转换)代码。我还没有将它用于PHP,所以你必须google。

答案 2 :(得分:0)

试试diyism_trace.php:

http://code.google.com/p/diyism-trace/