gpt4 book ai didi

php gearman worker 函数不与学说同步

转载 作者:行者123 更新时间:2023-11-29 02:11:47 24 4
gpt4 key购买 nike

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

在我调用的 gearman-worker 函数中,我可以通过 $doctrine = $this->getContainer()->get('doctrine') 访问 doctrine 对象并且它有效几乎正常。但是当我更改了数据库中的一些数据时,学说仍在使用以前存储在数据库中的旧数据。我完全糊涂了,因为我希望通过调用:

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

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

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

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

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

最佳答案

这就是我认为可能发生的情况。虽然可能是错误的。

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

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

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

关于php gearman worker 函数不与学说同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50446961/

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