PHP/MongoDB-从多个文档中提取记录,在对第一条记录执行操作后,光标消失

PHP/MongoDB-从多个文档中提取记录,在对第一条记录执行操作后,光标消失,php,mongodb,Php,Mongodb,我编写了一个脚本来查找集合中的所有记录,并告诉我用户是否需要通过电子邮件发送、不需要通过电子邮件发送或已取消订阅电子邮件 我可以让它告诉我这些信息,但是,当添加一个像回显测试电子邮件模板($m)这样简单的操作时,脚本在传递一条记录后死亡,导致错误: “连接到MongoDB服务器时出错连接已终止, 而这个光标是死的” 代码: $date=date('Y-m-d'); $pastdate=日期('Y-m-d',标准时间('-1周'); 试一试{ $conn=newmongo('localhost')

我编写了一个脚本来查找集合中的所有记录,并告诉我用户是否需要通过电子邮件发送、不需要通过电子邮件发送或已取消订阅电子邮件

我可以让它告诉我这些信息,但是,当添加一个像回显测试电子邮件模板($m)这样简单的操作时,脚本在传递一条记录后死亡,导致错误:

“连接到MongoDB服务器时出错连接已终止, 而这个光标是死的”

代码:

$date=date('Y-m-d');
$pastdate=日期('Y-m-d',标准时间('-1周');
试一试{
$conn=newmongo('localhost');
$db=$conn->remo;
$c=$db->data;
$cursor=$c->find(数组('last_email'=>array('$nin'=>array()));
foreach($cursor作为$obj){
if($obj['last_email']==null)| |($obj['last_email']数组('last_email'=>$date));
$cursor->update(数组('email'=>'.$obj['email'].'),$newdate);
}否则{
回显“取消订阅”。$obj[“电子邮件”];
}
}否则{
回显'noemail'。$obj['email'];
}
}
//断开与服务器的连接
$conn->close();
}捕获(MongoConnectionException$e){
die('连接到MongoDB服务器时出错'$e->getMessage());
}捕获(MongoException$e){
die('Error:'。$e->getMessage());
}

我不明白为什么脚本会起作用,直到我简单地添加了一个回音为每个需要电子邮件的用户进行回送。一旦我可以使用简单的回送,我计划为实际的邮件部分添加脚本。

只是想知道这是否是整个应用程序列表。是否可能在同一用户空间中运行其他东西?该消息似乎表明有其他东西挂断了连接b在循环完成之前。可能正在运行任务计划程序服务?有另一个单独的脚本与此mongo db联系,但由于此应用程序未投入生产,当我运行您看到的特定脚本时,没有人会使用它。不过,这是我正在运行的完整脚本。希望这能回答您的问题?唯一的我能想到的是,我的代码可能无法正确地迭代多条记录。它找到一条记录,执行操作,然后停止…哦,而且没有任务调度程序。为了更有趣,请尝试删除对
$conn->close()的调用
并查看您得到的结果。调用应该是同步的,但至少这会为测试隔离一些内容。同样的错误。因此,脚本在运行时被某些内容杀死。它似乎会停止对消息的回显,因为它找到了第一条记录。如果我去掉回显,它将遍历所有记录并正确执行。我不知道为什么回显会导致连接中断?只是好奇这是否是整个应用程序列表。是否可能在同一个用户空间中运行其他东西?该消息似乎表明在循环完成之前有其他东西挂断了连接。可能正在运行任务计划程序服务?没有另外,还有一个单独的脚本与这个mongo db联系,但由于这个应用程序不在生产环境中,所以当我运行您看到的这个特定脚本时,没有人会使用它。不过,这是我正在运行的完整脚本。希望这能回答您的问题?我能想到的唯一一件事是,我的代码可能无法正确地迭代多个记录rds。它找到一条记录,执行操作,然后停止…哦,而且没有任务调度程序。为了更有趣,请尝试删除对
$conn->close()的调用
并查看您得到的结果。调用应该是同步的,但至少这会为测试隔离一些内容。同样的错误。因此,脚本在运行时被某些内容杀死。它似乎会停止对消息的回显,因为它找到了第一条记录。如果我去掉回显,它将遍历所有记录并正确执行。我不知道为什么回声会导致连接中断?
$date = date('Y-m-d');
$pastdate = date('Y-m-d', strtotime('-1 week'));
                try {
                    $conn = new Mongo('localhost');
                    $db = $conn->remo;
                    $c = $db->data;
                    $cursor = $c->find( array('last_email'=>array('$nin' => array())));
                    foreach($cursor as $obj) { 
                        if (($obj['last_email'] == null) || ($obj['last_email'] <= $pastdate)) {
                            if($obj['weeklyemail'] === '1') {
                                //Debugging
                                echo 'email'.$obj['email'];
                                //Message to send
                                $m = "Hello ".$obj['first_name'].", this is a test.";
                                echo $m;
                                //Do the mail

                               //Update the date for last_email for user
                                    $newdate = array('$set' => array('last_email' => $date));
                                    $cursor->update(array('email' => ''.$obj['email'].''), $newdate);

                            } else {
                                echo 'unsubscribed'.$obj['email'];
                            }
                        } else {
                            echo 'noemail'.$obj['email'];
                        }
                    }

                // disconnect from server
                $conn->close();
                }  catch (MongoConnectionException $e) {
                    die('Error connecting to MongoDB server' . $e->getMessage());
                } catch (MongoException $e) {
                    die('Error: ' . $e->getMessage());
                }