8

我的任务是为不同的评估阶段(dev/test/staging/etc)建立一个关于各种环境的网站。

然而,在我们的暂存环境中,似乎有一些差异会阻止 PHP 脚本完成,因此页面永远不会传递到浏览器。

我想知道是否有一种方法可以在断开连接时输出记录某种堆栈跟踪或回溯,或者是否有其他方法可以找出 PHP 在脚本生命周期中的任何给定点到底在做什么?

这是一个 Drupal 站点,因此它涉及很多我不熟悉的代码,并且可能需要几个小时才能die;在整个过程中散布命令以查看脚本加载到的位置。

我知道我可能应该查看环境中的差异,但是所有环境都应该具有非常相似的配置(Ubuntu 11.04),并且登台环境似乎非常乐意为其他 PHP 站点提供服务,而这个特定站点拒绝完成。如果有的话,这个登台站点比其他没有问题的环境有更多的可用资源。

更新:对不起,最后发现了问题。暂存环境位于不允许通过公共 IP 访问自身的 VLAN 上,并且无论出于何种原因(仍然对此感到困惑),它试图将自身作为页面加载的一部分进行访问,并且从未完成请求。为 127.0.0.1 设置主机文件条目可解决此问题。

4

2 回答 2

3

使用像 xDebug 这样的工具逐步调试这样的问题是一种选择,但可能需要很长时间 - 找到放置断点的位置将与计算放置die语句的位置大致相同围绕代码。调试器选项是一种更好的方法,但相比之下不会节省太多,当你遇到这样的问题时,你在大量未知代码的某个地方有一个未知的阻止程序。

但是 xDebug 也有一个分析器工具,它可以显示在程序运行期间调用了哪些函数,它们花费了多长时间,并突出显示瓶颈所在。这可能是一个更好的起点。只需配置 xDebug 以生成分析器跟踪,然后使用 kCacheGrind 在图形环境中查看跟踪。

如果您的程序卡在一个循环中或某些特定的事情需要很长时间才能完成,这将几乎立即查明问题;您将能够准确地看到哪个函数正在花费时间,以及调用链看起来像什么。

很有可能一旦你看到了,你就可以通过查看相关代码来找到问题所在。但如果不能,您可以使用 xDebug 的 step-thru 调试器在函数运行时对其进行分析,并查看变量设置为什么以了解其循环的原因。

xDebug 可以在这里找到:http ://www.xdebug.org/

于 2013-02-28T11:04:33.903 回答
2

使用 xDebug。

它非常易于安装和使用。它有几个选项,如断点,并在完成加载之前逐步跟踪 PHP 脚本的状态

你可以从这里下载xDebug http://www.xdebug.org/

设置 xdebug 的分步教程可在sachithsays.blogspot.com/ 获得

于 2014-05-05T05:10:04.983 回答