【发布时间】:2012-05-16 03:43:20
【问题描述】:
我发现错误的一个常见原因是an exception being thrown from within an exception handler。我很确定这不会发生在我正在尝试调试的应用程序中...但是我已将所有初始化处理行放在 index.php 的顶部的 try/catch 中。*
这显然也可能发生,因为some things cannot be serialized to be stored in a session。这个应用程序最多将数组存储到会话中(相当多),但我相信它不会在其中存储任何不寻常的东西。
有人评论说这发生在他们身上是因为他们的主键needed to be CHAR(32) instead of INT(11)。本应用中的PK都是INT。
其他建议是 PHP 5.3.3 fixed in 5.3.6、full disk 和 need to typecast a SimpleXML value 可能存在问题。我们确实正在运行 PHP 5.3.3,但在这种情况下升级必须是最后的手段。它并不总是这样做。
更新/注意:我自己实际上无法重现错误,只能在日志中看到它发生,请参阅下面的段落了解我相信错误发生的位置...
* 从错误日志中,似乎至少有一个地方发生了 index.php。我推断这一点只是因为它在某些条目中由引用 URL 指示。 try/catch 代码目前仅围绕脚本的“顶部”初始化部分,其下方主要是 HTML 输出。输出中有一些 PHP 代码(虽然很简单),所以我可能需要对其进行测试。这是捕获部分,它不会在日志中产生任何输出:
} catch (Exception $e) {
error_log(get_class($e)." thrown. Message: ".$e->getMessage(). " in " . $e->getFile() . " on line ".$e->getLine());
error_log('Exception trace stack: ' . print_r($e->getTrace(),1));
}
非常感谢任何关于此的提示!
编辑:PHP 作为 Apache 模块运行(服务器 API:Apache 2.0 处理程序)。我认为没有使用任何 PHP 加速器,但可能只是我不知道如何判断。 listed on Wikipedia 中没有一个在 phpinfo() 中。
据我所知,MPM 是 prefork。这是我第一次研究 MPM:
# ./httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
【问题讨论】:
-
你是否从析构函数中抛出异常?
-
你能可靠地重现这个吗?如果是这样,我会尝试在 Web 服务器之外运行有问题的代码,如果可能的话,或者在 CGI 等基本的东西下运行。我有一个模糊的回忆,我有这个错误,这与我运行 PHP 的 MPM 有关。
-
@DampeS8N,我相信析构函数中没有异常代码,如果有的话,应用程序并没有真正过多地使用析构函数..
-
好吧,然后尝试找到相似之处。在您收到的每个请求开始时,将当前时间戳和 print_r(get_defined_vars()) 写入日志文件。甚至更好:让
tcpflow运行,这样您就可以完整地转储http 标头。然后,每当错误日志中发生错误时,尝试通过时间戳识别正确的日志文件和日志文件上的位置。重建确切的 http 请求标头并将其发送到您的服务器。也许这会帮助你重现。 -
@yankee,你就是那个男人!使用日志输出精确定位...会话中存储了一对
SimpleXMLElements。但是,要注意的是,它只会在访问以前从未存在过的 IP 时发生,所以我不会注意到我自己的任何请求触发它!期待在某个时候尝试 tcpflow.... 现在,我没有看到再次“开始赏金”的选项,您知道是否有其他方式可以奖励您更多积分(有 50 个代表点没有补充的赏金)?您只想创建一个我会接受的答案吗?
标签: php exception error-handling