我观察到我的学说对象有一个奇怪的行为。在我的 symfony 项目中,我使用带有原则的 ORM 将数据保存在 mysql 数据库中。这在大多数情况下都可以正常工作。我还在我的项目中使用 gearman,这是一个允许应用程序并行完成任务的框架。我有一个gearman job-server在我的 apache 运行的同一台机器上运行,并且我使用 screen 在同一台机器上的单独“屏幕” session 中注册了 gearman 工作人员窗口管理器。通过这种方法,我始终可以通过为 gearman-worker 注册的功能访问标准控制台。
在我调用的 gearman-worker 函数中,我可以通过 $doctrine = $this->getContainer()->get('doctrine')
访问原则对象。它几乎可以正常工作。但是,当我更改数据库中的某些数据时,学说仍然使用以前存储在数据库中的旧数据。我完全困惑了,因为我期望通过调用:
$repo = $doctrine->getRepository("PackageManagerBundle:myRepo");
$dbElement = $repo->findOneById($Id);
我总是从数据库中获取当前的数据条目。这看起来像是一种奇怪的缓存行为,但我不知道我做错了什么。
我可以通过注册 gearman 工作人员和新功能来解决这个问题:
$worker = new \GearmanWorker();
$worker->addServer();
$worker->addFunction
之后,我恢复了数据库的当前状态,直到我更改了其他内容。我仅在我的 gearman 工作函数中观察到这种行为。在应用程序的其余部分中,一切都与我的数据库同步并且正常。
最佳答案
我认为这可能会发生。但也可能是错误的。
齿轮 worker 将是一个长期运行的过程,负责挑选要做的工作。然后,它获得的第一个作业将导致原则将实体从数据库加载到其对象映射中。但是,对于工作人员收到的第二项工作,原则不会执行数据库查找,而是检查其身份映射并发现它已经加载了对象,因此将简单地从内存中返回该对象。如果工作进程外部的其他东西改变了数据库记录,那么您最终会得到一个过时的对象。
您可以告诉doctrine从其身份映射中删除对象,然后它将执行数据库查找。要强制再次从数据库加载对象而不是从身份映射中提供对象,您应该使用 EntityManager#clear()。
关于php gearman工作函数与学说不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50446961/