【问题标题】:Is there any way around the "parse error of death"?有没有办法解决“死亡解析错误”?
【发布时间】:2012-08-21 01:43:39
【问题描述】:

我很确定我不仅仅是一个注意到 PHP 上的简单解析错误的人,如果存在于非常嵌套的场景中(例如,一个引用另一个对象实例的对象实例,该对象实例引用另一个具有非常微小的解析错误,所有这些都是自动加载的)可以使 PHP 永远挂起,而不是像通常那样报告解析错误并停止执行——我已经看到很多次了,而且在非常不同的代码库中,总是使用正确的error_reporting 设置集。

有什么办法解决吗?即,是否可以强制以某种方式显示解析错误报告?

作为记录,我 100% 确定这些挂起是由于 PHP 没有正确处理解析错误造成的,因为我已经多次调试过这种行为;我问的原因是因为当这些挂起发生时,基本上是一无所知,甚至无法判断 PHP 是否表现得好笑,或者代码中的某个地方确实存在故障循环——这需要时间来调试,时间可能如果您知道,PHP 报告了应有的解析错误,则可以保存。

【问题讨论】:

  • 我发现error_reporting(E_ALL); 显示了我所有的错误。
  • 你能设计一个场景来简洁地在代码中演示这一点吗?
  • 错误甚至没有出现在服务器日志中?
  • 解析错误不会导致挂起。解析错误发生在任何代码执行之前,发生时会导致引擎停止。
  • @ChrisHenry 我很确定我所看到的是真实的。我不认为它可以在没有自动加载的情况下被复制。

标签: php exception-handling error-handling xdebug parse-error


【解决方案1】:

正如 cmets 中部分提到的,error_reporting(E_ALL) 可以帮助显示所有错误。您可能还必须使用ini_set 并使display_errors 具有on 的值。

我个人认为你的问题不是很清楚,应该改进格式,让它更容易理解。

更新:您运行代码的服务器/计算机似乎很慢。不应该真正发生“闲逛”。或者你能更详细地描述一下吗?

此外,您可能会陷入无限或接近无限的循环。仔细检查您的代码,因为除非您发布所有代码,否则这是我们可以帮助您的极限。

更新 2: 似乎您在尝试调用对象时输入了错误的对象名称。否则,可能是你没有正确声明你的对象。

很可能是其中之一。

【讨论】:

  • 谢谢,但没有帮助。请参阅我在问题中的最后评论。
  • 谢谢,但我并不担心错误本身,我担心 PHP 没有在应该报告错误的时候报告错误。
【解决方案2】:

原来罪魁祸首是xdebug.collect_params,文档非常正确地建议保持禁用状态。某些错误只是在调用堆栈跟踪的参数中生成大量数据,这些数据耗尽了 xdebug 并将 collect_params 设置为 4 并使 xdebug 和扩展 PHP 挂起,即使我有一个自定义异常处理程序,但实际上从未从 xdebug 检索堆栈跟踪,但显然 xdebug 无论如何都会收集这些数据。

这很难调试,因为:a) 复制并不简单 b) 使用 xdebug 进行分析没有帮助 c) 使用 xdebug + dbgp 单步执行代码也没有帮助 d) 几乎没有跟踪(没有双关语)除了非常偶尔将错误记录到 php error_log 文件和 e) 使用自定义异常处理程序之外,它并不明显怀疑 xdebug,因为我没有在处理过程中涉及它例外,至少我是这么认为的。

所以没有死亡解析错误这样的东西,我学会了永远不要认为这不是我的错 :) 希望这个答案至少能在未来对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2021-06-03
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多