Php Doctrine2和MongoDB-在长轮询循环中未从数据库中获取实际值
我们正在Symfony应用程序中实现长轮询,因此controller1更新类用户实例的某些成员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
$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