MongoDB - PHP - MongoCursorException“找不到游标”

2024-02-23

我有 2 个集合:A(380 万个文档)和 B(170 万个文档)

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

  1. 循环遍历 A 中的每条记录
  2. 〜60% 的时间,它在 B 上执行 findOne(使用 _id)
  3. 做一些基本的数学运算,创建一个 php 数组

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

4)循环php数组

5)更新插入到集合C中

在(1)期间,我始终得到: PHP Fatal error: Uncaught exception 'MongoCursorException' with message 'Cursor not found' 最后处理的项目是 3872494 中的#8187。

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 异常)。


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

是的,这绝对是首先要做的事情。异常发生有几十个合理的理由吗?哎呀,当主数据库离线并且无法访问时,您认为会发生什么?

……为什么会被扔掉?

有几个潜在的原因,但让我们直接讨论您看到的错误代码。

  • 官方 PHP 文档是here http://us.php.net/manual/en/class.mongocursorexception.php.
  • 引用该页面的内容:驱动程序试图从数据库中获取更多结果,但数据库没有查询记录。这通常意味着光标在服务器端超时......

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

  • 连接超时
  • 光标超时

您遇到了光标超时。您可以连接到数据库,但您的查询“没有时间”。

可能的修复:

  1. 延长光标timeout http://us.php.net/manual/en/mongocursor.timeout.php。或者您可以将其设置为零并使其永远持续。
  2. 分批进行这项工作。获取前 1000 个_ids从 A 开始,处理它们,然后标记您已完成此操作。然后得到下一个1000_ids比您上次跑步的成绩更好等等。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB - PHP - MongoCursorException“找不到游标” 的相关文章

随机推荐