【问题标题】:How to debug a PHP script that never finishes loading?如何调试永远不会完成加载的 PHP 脚本?
【发布时间】:2014-05-05 13:10:04
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你研究过 xdebug 吗?
  • 可以选择分步调试器吗? xdebug.org/docs/remote
  • 如果你想使用die(),那么我倾向于做的方法与你猜1到1000时使用的方法相同。首先从一半开始(500),然后那么如果它没有达到那个点,那么这个点必须在之前,你再一次减半(250)等等。
  • 我会在有问题的服务器上安装 Drupal 的干净副本,看看是否可行。另外,我不确定是否一定需要几个小时才能将一些出口添加到您的代码库中 - 尝试十分钟,这可能是值得花费的时间。

标签: php debugging


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 不错的综合答案。即使我不再需要,或者有时间完成它的步伐,我会在下次不可避免的情况下指定它:) 谢谢!
【解决方案2】:

使用 xDebug。

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

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

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

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多