Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2和MongoDB-在长轮询循环中未从数据库中获取实际值_Php_Mongodb_Symfony_Doctrine Orm_Long Polling - Fatal编程技术网

Php Doctrine2和MongoDB-在长轮询循环中未从数据库中获取实际值

Php Doctrine2和MongoDB-在长轮询循环中未从数据库中获取实际值,php,mongodb,symfony,doctrine-orm,long-polling,Php,Mongodb,Symfony,Doctrine Orm,Long Polling,我们正在Symfony应用程序中实现长轮询,因此controller1更新类用户实例的某些成员 $dm = $this->get('doctrine_mongodb')->getManager(); ... $User->setSomeValue($value); $dm->persist($User); $dm->flush(); 另一个控制器2首先包含长轮询循环 以一定的间隔从数据库中获取$user和值 执行$dm->r

我们正在Symfony应用程序中实现长轮询,因此controller1更新类用户实例的某些成员

     $dm = $this->get('doctrine_mongodb')->getManager();
...
     $User->setSomeValue($value);
     $dm->persist($User);
     $dm->flush();
另一个控制器2首先包含长轮询循环 以一定的间隔从数据库中获取$user和值 执行$dm->refresh($User)并提取值

     $dm = $this->get('doctrine_mongodb')->getManager();
...
     $User=$userRepo->findOneBy(array('id' => $userId));
     $value = $User->getSomeValue();
...
      while(...){
        sleep(1);
        $iteration++;
        $dm->refresh($User);
        $value = $User->getSomeValue();
...
     }
如果controller1在循环执行期间更新了值,则controller2会在循环内获取旧值,但不会获取更新后的值


问题是什么

我无法使用以下CLI脚本重现您描述的问题。它们是根据
tools/sandbox/index.php
示例(包含在ODM存储库中)建模的,并且从同一目录运行

第一个脚本,
poll.php
,每秒刷新一次特定文档并打印一些字符串字段:

<?php

require_once __DIR__ . '/config.php';

$id = new MongoId('5432e4e6e84df199228b4567');
$repo = $dm->getRepository('Documents\User');
$user = $repo->findOneBy(['_id' => $id]);
$iteration = 0;
printf("%d: %s\n", $iteration, $user->getUsername());

poll: {
    sleep(1);
    $iteration++;
    $dm->refresh($user);
    printf("%d: %s\n", $iteration, $user->getUsername());
}

goto poll;
我对
tools/sandbox/Documents/User.php
模型做了一个小改动,并添加了
setId()
方法。这允许
modify.php
脚本在第一次运行时执行upsert,并创建稍后将修改的文档

有了这两个文件,我开始创建文档:

$ php modify.php 
Changed username to: 9bdfab05b06306e97d2f63c9bc0a34ef
然后,我在第二个终端中启动了
poll.php
,并继续运行了几次
modify.php

$ php poll.php 
0: 9bdfab05b06306e97d2f63c9bc0a34ef
1: 9bdfab05b06306e97d2f63c9bc0a34ef
2: 8420c8ef0ee7194624fead56585e8be5
3: 8420c8ef0ee7194624fead56585e8be5
4: bf2ec4bafae4cf47e3162ce857e861e7
5: bf2ec4bafae4cf47e3162ce857e861e7
6: bf2ec4bafae4cf47e3162ce857e861e7
7: 2051dd54bc2883f6c11e6c2bbfdfd13e
8: 2051dd54bc2883f6c11e6c2bbfdfd13e
9: 2051dd54bc2883f6c11e6c2bbfdfd13e

如果在
DocumentManager::refresh()
中跟踪调用,您将看到它最终调用,它非常简单地通过
doctor\MongoDB\Collection
包装类查询原始文档数据,对该数据进行水合物化,并重置原始文档数据(用于变更集计算)。如果您没有看到新数据,那么调试已水合并重新分配给快照的原始数据(来自MongoDB)将是一个很好的开始。

我认为您需要在第二个控制器中断开对象的连接,因为有多个EntityManager
$ php poll.php 
0: 9bdfab05b06306e97d2f63c9bc0a34ef
1: 9bdfab05b06306e97d2f63c9bc0a34ef
2: 8420c8ef0ee7194624fead56585e8be5
3: 8420c8ef0ee7194624fead56585e8be5
4: bf2ec4bafae4cf47e3162ce857e861e7
5: bf2ec4bafae4cf47e3162ce857e861e7
6: bf2ec4bafae4cf47e3162ce857e861e7
7: 2051dd54bc2883f6c11e6c2bbfdfd13e
8: 2051dd54bc2883f6c11e6c2bbfdfd13e
9: 2051dd54bc2883f6c11e6c2bbfdfd13e