2014-10-05 71 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),如果你沒有看到新的數據,那麼獲取水分並重新分配給快照的原始數據將是一個很好的開始。

相關問題