gpt4 book ai didi

php - MongoDB 和 PHP 库游标超时

转载 作者:可可西里 更新时间:2023-11-01 10:10:44 24 4
gpt4 key购买 nike

在使用官方MongoDB的PHP库(https://docs.mongodb.com/php-library/master/tutorial/install-php-library/)时,如何将游标超时设置为无限?我阅读了混合文档,通常很难理解它指的是旧的 PHP 驱动程序还是新的(我正在谈论的)。

例如:

$cursor = $col->find();
foreach ($cursor as $document) {
// slow code..
}

如何防止游标超时(参见下面的错误)并确保游标在没有任何内存泄漏的情况下关闭?

Fatal error: Uncaught MongoDB\Driver\Exception\RuntimeException: 
cursor id 123456789 not found in /var/www/html/code.php:1

这里有一些类似的问题(比如 this ),但似乎我们缺乏明确的引用。

最佳答案

cursor id 123456789 not found in /var/www/html/code.php:1

通常这是因为应用程序在 getMore 命令之间花费的时间太长。换句话说,游标在第一次迭代时返回了一些记录,并且循环需要很长时间才能请求更多记录。

$cursor = $collection->find( [ 'field' => 'foobar'] );
foreach ($cursor as $document) {
// long running processes (slow)
}

游标在服务器上有一个超时,大约 10 分钟后,如果客户端没有向服务器发送任何命令,它将因不活动而关闭。在上述情况下,当它请求下一批时,游标已被终止,导致错误消息 cursor id not found

有些人试图通过在游标上设置 noCursorTimeout:true 来禁用游标超时。虽然不推荐这样做,因为当从服务器返回的 getMore 结果出现问题时,您可能会得到一个永远存在的游标(僵尸)。即,带有 noCursorTimeout 的游标可能会在客户端断开连接后很长时间内在服务器上保持事件状态。

有几个可能的解决方案:

  • 减少 cursor.batchSize() 。这是因为减少每批记录的数量会减少游标不活动的情况。即以前处理 100 条记录 15 分钟,现在只处理 50 条记录 7.5 分钟。

  • 手动创建 session ,即 PHPLIB MongoDB\Client::startSession()。然后将其作为查询的 session 选项传递。在长时间运行的迭代期间,定期使用同一 session 执行一些其他数据库交互,即 ping 服务器。这将使 session 保持事件状态(超时 30 分钟);但是,它不会使光标保持事件状态,因此您可以将其与 noCursorTimeout 结合使用。

关于php - MongoDB 和 PHP 库游标超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51790279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com