【问题标题】:php gearman worker function no synchronized with doctrinephp gearman worker 函数与学说不同步
【发布时间】:2018-10-30 23:58:29
【问题描述】:

我观察到我的教义对象的奇怪行为。在我的 symfony 项目中,我使用 ORM 和学说将我的数据保存在 mysql 数据库中。这在大多数情况下都正常工作。我也在我的项目中使用了 gearman,这是一个允许应用程序并行完成任务的框架。我有一个gearman job-server 在运行我的apache 的同一台机器上运行,并且我使用screen 窗口管理器在单独的“屏幕”会话中在同一台机器上注册了一个齿轮工作人员。通过这种方法,我总是可以通过为 gearman-worker 注册的功能访问标准控制台。

在我正在调用的 gearman-worker 函数中,我可以通过 $doctrine = $this->getContainer()->get('doctrine') 访问学说对象,它几乎可以正常工作。但是当我更改了数据库中的一些数据时,教义仍然使用以前存储在数据库中的旧数据。我很困惑,因为我期望通过调用:

$repo = $doctrine->getRepository("PackageManagerBundle:myRepo"); $dbElement = $repo->findOneById($Id);

我总是从我的数据库中获取当前的数据条目。这看起来像是一种奇怪的缓存行为,但我不知道我做错了什么。

我可以通过注册 gearman worker 和新函数来解决这个问题:

$worker = new \GearmanWorker(); $worker->addServer(); $worker->addFunction

之后,我恢复了数据库的当前状态,直到我更改了其他内容。我只在我的 gearman worker 函数中观察到这种行为。在应用程序的其余部分,一切都与我的数据库同步并且正常。

【问题讨论】:

  • 在使用之前尝试刷新对象引用,例如$doctrine->refresh($object)

标签: php mysql doctrine-orm gearman symfony-3.2


【解决方案1】:

这就是我认为可能发生的事情。不过可能是错的。

齿轮工人将是一个长期运行的流程,它会接手要完成的工作。然后,它获得的第一个工作将导致教义将实体从数据库加载到其对象映射中。但是,对于工人收到的第二份工作,教义不会执行数据库查找,而是检查它的身份映射并发现它已经加载了对象,因此只会从内存中返回一个。如果工作进程外部的其他东西改变了数据库记录,那么您最终会得到一个过期的对象。

您可以告诉教条从其身份映射中删除对象,然后它将执行数据库查找。要强制再次从数据库加载对象而不是从身份映射中提供对象,您应该使用 EntityManager#clear()。

更多信息在这里: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#entities-and-the-identity-map

【讨论】:

  • 非常感谢,您的假设是正确的。通过使用 clear() 函数刷新 $repo 对象,我的问题得到了解决: $repo = $doctrine->getRepository("PackageManagerBundle:myRepo"); $repo->clear(); $dbElement = $repo->findOneById($Id);
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多