gpt4 book ai didi

php - Doctrine 如何处理多个请求?

转载 作者:行者123 更新时间:2023-11-28 23:29:37 26 4
gpt4 key购买 nike

假设我有一个将行插入数据库的脚本,它看起来像这样:

/* $start is some GET parameter. Any number between 0 and 9900 */

/* Select all objects with ids between $start and $start+99
and put their ids into $ids array */
$qb->select('object');
$qb->from('AppBundle:Object','object');
$qb->where("object.id >= $start");
$qb->andWhere("object.id < $start+100");
$objects = $qb->getQuery()->getResult();

$ids = array();
foreach($objects AS $object) {
$ids[] = $object->getId();
}

/* Create missing objects and insert them into database */
for($id=$start; $id<$start+100; ++$id) {
if(in_array($id, $ids)) continue;
/* Some calculations */
$createdObject = new Object($id, $some, $data);
$em->persist($createdObject);
}
$em->flush();

现在假设还没有对象(表格是清晰的)并且一个用户以 start=0 进入站点。该脚本大约需要 2 秒才能完成。在它完成之前 - 另一个用户使用 start=50 进入站点。

我不确定在这种情况下到底会发生什么,但我认为:

  1. 第一个用户输入 - $ids 数组为空,脚本正在生成 ID 为 0-99 的对象。

  2. 第二个用户进入 - 尚未调用第一个入口的 $em->flush 表单,这意味着 $ids 数组仍然为空(我猜?)。该脚本正在生成 ID 为 50-149 的对象

  3. 第一个 $em->flush() 调用来自第一个用户入口。它将对象 0-99 插入到数据库中。

  4. 还有第二个 $em->flush() 调用来自第二个用户入口。它尝试将对象 50-149 插入到数据库中。它失败了,因为 id=50 的对象已经存在于数据库中。因此,它实际上并没有向数据库中插入任何内容。

真的会这样吗?如果是这样 - 如何防止它以及仅将那些丢失的对象插入数据库的最佳方法是什么?

@edit:这只是一个示例代码,但在实际脚本中,id 实际上是 3 列(x、y、z),对象是 map 上的一个字段。这个脚本的目的是我想要一个巨大的 map ,一次生成它会花费太多时间。所以我只想生成一点,然后仅在某些用户尝试访问它们时才创建缺失的部分。在某个时候,将创建整个 map ,但过程会错开。

最佳答案

这里有 2 个不好的做法:

  1. 当用户进入您的站点时,您应该避免执行 INSERT 或 UPDATE 操作(因为它们速度慢/成本高),尤其是当它像本脚本中那样将许多对象添加到数据库时。它应该在某种 cron 脚本中运行,独立于您的网站用户。
  2. 您不应该事先为您的对象分配 ID。将其保留为 null,Doctrine 将为您处理。为什么需要提前设置ID?

回答您的问题 - 如果您为具有预分配 ID 的对象调用 $em->persist() ,并且如果数据库中存在另一个具有相同 ID 的对象 - INSERT 将不会发生。取而代之的是,已经存在的对象将使用来自新对象的数据进行更新(当您之后调用 em->flush() 时)。因此,数据库中只有 1 个对象,而不是 2 个对象(如预期的那样)。所以这就是为什么我真的怀疑你是否需要提前预分配 ID。你应该告诉我更多关于这个的目的:)

关于php - Doctrine 如何处理多个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37767698/

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