gpt4 book ai didi

php websocket Ratchet 不从 Doctrine 中获取最新数据

转载 作者:行者123 更新时间:2023-12-04 16:13:14 24 4
gpt4 key购买 nike

我刚刚在使用 Symfony 4.1 和 https://github.com/GeniusesOfSymfony/WebSocketBundle 构建 WebSocket 应用程序时发现了一个非常有趣的事实。 (它建立在 PHP Ratchet 之上)。

我想使用 $repository->find(2); 定期从 MySQL 数据库中获取最新数据以进行测试。但即使我在订阅 WebSocket channel 时更改数据,它也总是返回相同的结果。

经过相当多的时间弄乱代码并哭泣后,我发现由于某种原因,Doctrine 正在缓存结果(或者我认为它就是这样做的)。

为了测试我的理论,我创建了一个服务,使用以下代码处理从数据库中获取数据:

/**
* @return mixed
* @throws \Doctrine\DBAL\DBALException
*/
public function fetchNewest()
{
$stmt = $this->em->getConnection()->prepare('SELECT * FROM test WHERE id=2');
$stmt->execute();

return $stmt->fetch();
}

出于某种原因,这奏效了。谁能解释为什么 find(2)方法没有产生最新的数据,而原始 SQL 却产生了?

最佳答案

这是正确的,也是 ORM 的预期行为。这是减轻数据库负载的一种方法。

它有据可查,但大多数时候我们只是跳到示例中而错过了它。 :)

由于 PHP 生命周期的原因,您通常不会在应用程序中注意到这一点。一个请求进来,一个响应出去,一切都关闭了。下一个请求从一个干净的石板开始。

如果你使用 websocket,这永远不会发生,PHP 只是永远运行(不是真的,但理想情况下), Ratchet 响应事件。

(关闭:查看 PHP-PM...他们已经能够达到 request/s 的急剧增加,因为他们颠覆了 PHP 生命周期)。

锁定模式是一种解决方案,但您也可以调用 $em->refresh($entity) ,这会触发从 db 重新加载。

编辑:文档 https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#entities-and-the-identity-map

关于php websocket Ratchet 不从 Doctrine 中获取最新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51581350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com