【发布时间】:2010-11-24 23:37:41
【问题描述】:
我有一个 PHP 脚本,它从数据库中抓取一大块数据,对其进行处理,然后查看是否还有更多数据。这个进程无限期地运行,我在一个服务器上一次运行其中的几个。
它看起来像:
<?php
while($shouldStillRun)
{
// do stuff
}
logThatWeExitedLoop();
?>
问题是,一段时间后,某些原因导致进程停止运行,我无法对其进行调试并确定原因。
这是我目前用来获取信息的内容:
- error_log - 记录所有错误,但错误日志中不显示任何错误。
- register_shutdown_function - 注册了一个自定义关闭函数。这确实被调用了,所以我知道该进程没有被服务器杀死,它被允许完成。 (或者至少我认为这是被调用的情况?)
- debug_backtrace - 在我的自定义关闭函数中记录了 debug_backtrace()。这仅显示一个呼叫,这是我的自定义关闭功能。
- 如果到达脚本结尾记录 - 在循环之外,我有一个函数可以记录脚本退出循环(因此通常会到达源文件的结尾)。当脚本随机终止时,它不会记录这个,所以无论什么杀死它,都会在它正在处理的过程中杀死它。
您还建议使用哪些其他调试方法来查找罪魁祸首?
注意:我应该补充一点,这不是 max_execution_time 的问题,这些脚本已禁用它。被杀前的时间不一致。它可以运行 10 秒或 12 小时后死亡。
更新/解决方案:谢谢大家的建议。通过记录输出,我发现当 MySql 查询失败时,脚本被设置为 die()。哦。更新它以记录 mysql 错误,然后终止。让它现在像魅力一样工作!
【问题讨论】:
-
php.net/manual/en/features.connection-handling.php 说“当计时器到期时,脚本将被中止,并且与上述客户端断开连接情况一样,如果已注册关闭函数,它将被调用。”所以你的陈述“这确实被调用了,所以我知道该进程没有被服务器杀死”,可能是错误的。
-
正如您所指出的,debug_backtrace 在关闭函数中是无用的,因为关闭函数有一个独立的调用堆栈,与触发它的任何原因无关。