我有一个长期运行的脚本,无缘无故地消失了.它应该运行超过8小时,但一两个小时后就会消失,没有错误,什么都没有.我尝试通过CLI和http运行它,没有区别.
我有以下参数设置:
set_time_limit(0);
ini_set('memory_limit', '1024M');
Run Code Online (Sandbox Code Playgroud)
我一直在监视内存使用情况,它不会超过200M
还有什么我想念的吗?它为什么会消亡?
一种可能的解释可能是PHP垃圾收集器干扰了脚本.这可能就是你看到随机死亡的原因.当垃圾收集器打开时,只要根缓冲区运行满,就会执行循环查找算法.
在PHP手册状态:
打开和关闭机制以及自行启动循环收集的能力背后的基本原理是,应用程序的某些部分可能具有高度时间敏感性.
您可以尝试使用禁用PHP垃圾收集器gc_disable.手册建议您gc_collect_cycles在禁用释放缓冲区之前调用此权限.
另一种解释可能是代码本身.一个8小时的脚本是一个很长的脚本,如果它很复杂,很容易遇到导致脚本退出的障碍.我认为,对于您现在的故障排除,您绝对应该使用错误报告来报告所有内容error_reporting(-1);.
此外,如果您的脚本正在与其他服务进行通信,例如数据库,那很可能是问题所在.如果数据库服务器内存不足或超时,则可能导致脚本挂起并死机.如果是这种情况,您可以拆分与数据库的连接,并在脚本期间以特定的时间间隔连接/断开连接以保持新连接.同样的心态可以应用于您可能正在与之通信的任何其他服务.
出于测试目的,您可以有目的地使您的脚本在每个成功的查询中写入日志文件,确保包含查询生成时的时间戳和查询结束时的时间戳.您可能不会收到任何错误,但它可以帮助您确定是否存在特定的问题查询,或者查询是否挂起的时间比平时长.您还可以检查以确保您的MySQL连接仍然有效,并打印出一些信息通知您.
示例日志文件:
[START 2011/01/21 13:12:23] MySQL Connection: TRUE [END 2011/01/21 13:12:28] Query took 5s
[START 2011/01/21 13:12:28] MySQL Connection: TRUE [END 2011/01/21 13:12:37] Query took 9s
[START 2011/01/21 13:12:39] MySQL Connection: TRUE [END 2011/01/21 13:12:51] Query took 12s
Run Code Online (Sandbox Code Playgroud)