【问题标题】:php exceeds execution time on throwing an exception in recursionphp在递归中抛出异常时超过了执行时间
【发布时间】:2013-07-07 21:59:33
【问题描述】:

编辑:从头开始重写,旧问题没有用

在递归中抛出异常后发生错误。 该异常不会在任何地方被捕获,它应该只是弹出并显示uncaught exception error,但它没有。相反,它会产生time limit hit 类型的错误。如果我将 var_dumps 放入我的代码中,看起来异常被抛出,但它只是冻结并在超出限制后失败。

这是递归函数的一部分:

if($this->prvky[$iA]->ini < 1 || $this->prvky[$iB]->ini < 1){
    echo '--- THROWING ---';
    throw new \OutOfBoundsException('ini is smaller than 1');
}

它在测试中运行得很好,可以抛出异常,如果是,它在uncaught exception 上成功失败。

当没有抛出异常时,In 在现实世界中运行良好。

但是当条件在现实世界中通过并抛出异常时,--- THROWING --- 会被打印出来,后面应该是uncaught exception,但它会疯狂地旋转并在一段时间后失败,从而产生time limit exceeded 错误。我确定会引发异常,并且我确定我不会在任何地方捕获异常。

【问题讨论】:

  • 你能添加更多代码吗?不容易理解递归中发生了什么。

标签: php exception recursion runtime-error xdebug


【解决方案1】:

真正的问题是out of memory 错误的组合,遗憾的是没有出现,xdebug 中的疯狂设置和产生大量数据的对象连接。

内存不足是因为异常跟踪了所有传递给函数的值,这要归功于这种疯狂的设置:

xdebug.var_display_max_depth = -1
xdebug.var_display_max_children = -1
xdebug.var_display_max_data = -1

很久以前我把它放在我的 xdebug 中并忘记了。 因此,那些引用其他对象的对象等等,整个结构(很多长配置)在每次调用时都重复存储在堆栈中。我虽然这应该只由 xdebug 处理,但似乎一旦抛出异常,xdebug 就会将此信息添加到异常的堆栈副本中,从而消耗大量内存。 (可能只是我的解释)

但它打印的是 out of time 而不是 out of memory。根据日志,both 错误(同一个请求中有 2 个致命错误) 一个接一个地发生,但只打印了第二个。堆栈中的数据非常长,因此在尝试将堆栈写入日志时超过了时间,在达到内存限制很久之后,产生了第二个错误,而不是第一个被打印出来。

【讨论】:

    猜你喜欢
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多