当前位置:  开发笔记 > 编程语言 > 正文

MongoDB - PHP - MongoCursorException'未找到游标'

如何解决《MongoDB-PHP-MongoCursorException'未找到游标'》经验,为你挑选了1个好方法。

我有2个集合:A(3.8M docs)和B(1.7M docs)

我有一个PHP脚本,我从shell运行:

    循环遍历A中的每条记录

    ~60%的时间,它在B上执行findOne(使用_id)

    做一些基本的数学,创建一个PHP数组

一旦完成了a中所有文档的循环:

4)循环遍历php数组

5)插入集合C

在(1)期间,我一直得到:PHP致命错误:未捕获异常'MongoCursorException',消息'找不到光标'最后处理的项目是#8187 of 3872494.

real    1m25.478s
user    0m0.076s
sys     0m0.064s

再次运行它,代码没有变化,在项目#19826/3872495处引发了异常

real    3m19.144s
user    0m0.120s
sys     0m0.072s

再次,#8181/387249

real    1m31.110s
user    0m0.036s
sys     0m0.048s

是的,我意识到我可以(并且可能应该)捕获异常......但是......为什么它甚至被抛出?特别是在进入数据库的这种不同的经过时间/深度.

如果有帮助,我的设置是3节点副本集(2 + arb).我让二级离线并尝试了主要的运行.相同的结果(处理的结果数量和次数不同,但总是抛出Cursor Not Found异常).



1> Gates VP..:

是的,我意识到我可以(并且可能应该)抓住异常......

是的,这绝对是第一件事.异常发生有几十个合理的原因?当主要离线并变得无法访问时,您认为会发生什么?

......为什么甚至被抛出?

有几个潜在的原因,但让我们直接切入你看到的错误代码.

官方PHP文档在这里.

从该页面引用:驱动程序试图从数据库中获取更多结果,但数据库没有查询记录.这通常意味着光标在服务器端超时...

MongoDB PHP驱动程序有两种不同的超时:

连接超时

游标超时

你正在达到游标超时.您可以连接到数据库,但您的查询"时间不多了".

可能的修复:

    延长光标超时.或者您可以将其设置为零并使其永久持续.

    分批完成这项工作._ids从A中获取前1000个,处理它们然后标记您已经这样做了.然后获得_ids比上次运行更大的下一个1000 ,依此类推.

我会建议#2以及处理异常.即使这些不能完全解决问题,它也可以帮助您隔离和缓解问题.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有