2014-10-05 70 views
0

我们正在实现我们的Symfony应用程序中的长轮询,所以控制器1更新类用户实例的一些成员Doctrine2和MongoDB - 实际值不是在长轮询循环数据库中获取

 $dm = $this->get('doctrine_mongodb')->getManager(); 
... 
    $User->setSomeValue($value); 
    $dm->persist($User); 
    $dm->flush(); 

另一个包含long-polling循环的controller2首先从数据库获取$ user和value,然后以一定的间隔 执行$ 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获取,但不是更新的值。

问题是什么?

+0

我认为你需要解开第二个控制器中的对象,因为有多个EntityManagers – manix 2014-10-06 01:19:36

回答

0

我无法重现您使用以下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; 

第二个脚本,modify.php,改变了同一文档的领域一个随机字符串。

<?php 

require_once __DIR__ . '/config.php'; 

use Documents\User; 

$id = new MongoId('5432e4e6e84df199228b4567'); 
$user = new User(); 
$user->setId($id); 
$user->setUsername(md5(rand())); 

$dm->persist($user); 
$dm->flush(); 

printf("Changed username to: %s\n", $user->getUsername()); 

我制成一个小的变化到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()内的呼叫,您会发现它最终会调用DocumentPersister::refresh(),它非常简单地通过Doctrine\MongoDB\Collection包装类查询原始文档数据,数据,并重置原始文档数据(用于变更集计算)。调试原始数据(来自MongoDB),如果你没有看到新的数据,那么获取水分并重新分配给快照的原始数据将是一个很好的开始。

相关问题