我能在PHP中打印整个程序状态吗?

9
PHP提供了一些令人印象深刻的内省设施:get_defined_vars, get_defined_functions, get_defined_constants, debug_backtrace等等,这些本质上提供了整个程序状态的视图:栈和堆。我想知道使用这些设施是否能够获得关于程序状态完整的视图。
堆和作用域中定义的所有变量可以被建模为一个带标签的有向图。所以举个例子,是否可能编写一些代码来给我展示Graphviz/DOT描绘的内容呢?我想象中类似于关于PHP如何管理变量的文章中的图表,或者是PHP手册页面上关于垃圾回收的图表

我认为没有办法在另一个作用域中访问变量,因此您可能无法对所有有趣的事情进行建模。我相信Xdebug可以在运行时提供所有变量的状态;您可以尝试修补它以将该信息写入某个地方(或者它可能已经可以这样做)。 - Waleed Khan
@WaleedKhan 我看了一下 Xdebug,但它似乎只是提供了一个更漂亮的 var_dump。我找到了这个 GDB 扩展来分析堆,但由于需要大量设置,并且是三年前编写的,可能无法正常工作,所以我还没有尝试过。 - jameshfisher
2
什么是状态?我的意思是,我可以有一个条件语句,当为真时,将类A与常量B定义为“foo”,当为假时,执行相同的操作,但使用“bar”作为常量。此外,您可能会对PHPUnit如何实现它感兴趣:https://github.com/sebastianbergmann/phpunit/blob/3.7/PHPUnit/Util/GlobalState.php - Chad Retz
@JuanTreminio 啊,看来我误解了。我刚刚设置好了,看起来很不错。不幸的是,堆检查器无法识别共享或循环引用,或者至少没有告诉我。例如,两个数组 $a$b 之间的相互引用会导致我能够无限扩展“树”。更糟糕的是,它有时候似乎会说谎。一个带有对自身的引用的数组 $a($a = []; $a['a'] =& $a;)会导致它说 $a['a'] 没有元素,这是不正确的(例如,我可以 var_dump($a['a']['a']);)。尽管如此,这仍然是一个有用的工具。 - jameshfisher
值得注意的是,“lying”行为与var_dump在遇到循环时的行为相同。 - jameshfisher
显示剩余2条评论
4个回答

1

结账时,请安装xdebug和xdebug chrome扩展程序。 https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc?hl=en

该扩展程序可用于启用php的分析/调试。您可以将其与eclipse或任何其他支持xdebug进行调试的ide链接。

如果您生成了一个概要文件,可以将结果放入kcachegrind或wincachegrind中,以获得内存分配图视图,每个函数中花费的时间以及其他内容。

https://www.youtube.com/watch?v=YHKFdfbcP8U


1
如果您生成一个配置文件,您可以将结果放入kcachegrind或wincachegrind中,以获得内存分配的地图视图,每个函数中花费的时间以及其他信息。

https://www.youtube.com/watch?v=YHKFdfbcP8U


有趣的 - 我会试试这个。 - jameshfisher

0

我不知道是否有现成的工具,但你肯定应该查看与kcachegrind配合使用的xdebug分析器http://xdebug.org/docs/profiler。它将为您提供整个堆栈的可视化:调用的每个函数,调用次数以及所花费的时间。


0

get_defined_vars
get_defined_functions
get_defined_constants

有没有办法从一个php文件中获取用户定义的php函数、变量和常量?以下函数不是最好的方法,因为它们会获取所有已声明的函数/变量/常量(包括数百个php内置常量和内部php函数)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接