2014-10-05 6 views
0

가 controller1 클래스 사용자의 인스턴스의 일부 멤버를 업데이트 있도록 긴 폴링 루프에서 데이터베이스에서 가져 왔습니다Doctrine2 및 MongoDB를이 - 실제 값은 우리는 우리의 심포니 응용 프로그램에서 긴 폴링을 구현

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

긴 폴링 루프를 처음으로 포함하는 다른 컨트롤러 2 은 데이터베이스에서 $ 사용자 및 값을 가져오고 은 $ 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(); 
... 
    } 

루프 실행 중에 컨트롤러 1이 값을 업데이트하면 이전 값은 루프 내에서 controller2에 의해 페치되지만 업데이트 된 값은 페치되지 않습니다.

무엇이 문제입니까?

+0

여러 개의 EntityManagers로 인해 두 번째 컨트롤러에서 객체를 분리해야한다고 생각합니다. – manix

답변

0

다음 CLI 스크립트로 설명하는 문제를 재현 할 수 없습니다. 이들은 예제 (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()); 

는 I는 tools/sandbox/Documents/User.php 모델 작은 변화를 만들어지고 setId() 방법을 추가했다. 이렇게하면 modify.php 스크립트가 처음 실행될 때 upsert를 수행하고 나중에 수정할 문서를 만들 수 있습니다. 대신에이 두 파일로

, 나는 문서 작성하여 일을 시작했다 : 나는 다음 두 번째 터미널에서 poll.php을 시작

$ php modify.php 
Changed username to: 9bdfab05b06306e97d2f63c9bc0a34ef 

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() 내에서 전화를 추적하면 Doctrine\MongoDB\Collection 래퍼 클래스를 통해 원시 문서 데이터를 쿼리하는 매우 궁극적으로 DocumentPersister::refresh()이 호출됨을 알 수 있습니다. 데이터를 가져오고 원본 문서 데이터를 다시 설정합니다 (변경 집합 계산에 사용됨). 스냅 샷에 수화되고 재 할당 된 원시 데이터 (MongoDB에서)를 디버깅하는 것이 새로운 데이터를 보지 못한다면 시작할 수있는 좋은 곳입니다.